当前位置: 首页 > 知识库问答 >
问题:

加特林中的过帐请求

湛文乐
2023-03-14

我遇到了一个pdf文件的问题。在Gatling 2.1.7中录制了一个HAR文件后,我有以下内容:

.exec(http("request_10")
        .post("/api/data/files?revisionId=e9af2c93-d8df-4424-b307-df4c4abbaad1&uploadType=read_only_file&fileType=application%2Fpdf&fileName=testdocument.pdf&fileSize=10080&copyToEditable=true")
        .headers(Map(
            "Accept-Encoding" -> "gzip, deflate",
            "Content-Type" -> "multipart/form-data; boundary=----WebKitFormBoundaryawCJ4mjL1imiO7Ye"
            "Origin" -> url))
        .body(RawFileBody("RecordedSimulation_0010_request.txt")))

使用RecordeSimulation_0010_Request.txt的内容:

------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableChunkNumber"

1
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableChunkSize"

1048576
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableCurrentChunkSize"

10080
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableTotalSize"

10080
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableType"

application/pdf
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableIdentifier"

66dc65bf-265d-4363-96fd-7fc13f8ceda4
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableFilename"

testdocument.pdf
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableRelativePath"

testdocument.pdf
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="resumableTotalChunks"

1
------WebKitFormBoundaryawCJ4mjL1imiO7Ye
Content-Disposition: form-data; name="file"; filename="blob"
Content-Type: application/octet-stream


------WebKitFormBoundaryawCJ4mjL1imiO7Ye--
val documentFeeder = Iterator.continually(Map(
        "documentBoundary" -> (Random.alphanumeric.take(16).mkString),
        "documentUuid" -> ((Random.alphanumeric.take(8).mkString + "-" +
                           Random.alphanumeric.take(4).mkString + "-" + 
                           Random.alphanumeric.take(4).mkString + "-" +
                           Random.alphanumeric.take(4).mkString + "-" +
                           Random.alphanumeric.take(12).mkString).toLowerCase)))

...

.feed(documentFeeder)
// a previous exec POST with a check to grab the documentRevisionId

.exec(http("Post document: upload the file")
            .post("/api/data/files")
            .queryParamMap(Map(
                "revisionId" -> "${documentRevisionId}",
                "uploadType" -> "read_only_file",
                "fileType" -> "application%2Fpdf",
                "fileName" -> "testdocument.pdf",
                "fileSize" -> "10080",
                "copyToEditable" -> "true"))
            .headers(Map(
                "Accept-Encoding" -> "gzip, deflate",
                "Content-Type" -> "multipart/form-data; boundary=----WebKitFormBoundary${documentBoundary}"
                "Origin" -> url))

            .body(StringBody("""------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableChunkNumber"

                                1
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableChunkSize"

                                1048576
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableCurrentChunkSize"

                                10080
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableTotalSize"

                                10080
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableType"

                                application/pdf
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableIdentifier"

                                ${documentUuid}
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableFilename"

                                testdocument.pdf
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableRelativePath"

                                testdocument.pdf
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="resumableTotalChunks"

                                1
                                ------WebKitFormBoundary${documentBoundary}
                                Content-Disposition: form-data; name="file"; filename="blob"
                                Content-Type: application/octet-stream
                                Content-Transfer-Encoding: BINARY


                                ------WebKitFormBoundary${documentBoundary}--""")))

最后,下面是在应用程序中发布虚拟数据的Node.js代码(我将此作为参考,因为我知道它可以工作):

var resumableData = {
        resumableChunkNumber: 1,
        resumableChunkSize: 1048576,
        resumableCurrentChunkSize: file.size,
        resumableTotalSize: file.size,
        resumableType: guessBestMimeType(file.name, file.type),
        resumableIdentifier: genUuid(),
        resumableFilename: file.name,
        resumableRelativePath: file.name,
        resumableTotalChunks:1
    };

    var boundaryKey = Math.random().toString(16); // random string

    // the header for the one and only part (need to use CRLF here)
    var resumableBody = '';

    for(var resumablePart in resumableData){
        if(resumableData.hasOwnProperty(resumablePart)){
            resumableBody +=
                '--' + boundaryKey + '\r\n' +
                'Content-Disposition: form-data; name="' + resumablePart + '"\r\n\r\n' +
                resumableData[resumablePart] + '\r\n';
        }
    }
    resumableBody +=
        '--' + boundaryKey + '\r\n' +
        'Content-Disposition: form-data; name="file"; filename="blob"\r\n' +
            // use your file's mime type here, if known
        'Content-Type: application/octet-stream\r\n' +
        'Content-Transfer-Encoding: BINARY\r\n\r\n';

    var resumableEnd = '\r\n--' + boundaryKey + '--';

    var request = https.request({
        method : 'POST',
        host : config.API_HOST + config.BASE_URL,
        port : config.API_PORT,
        path : generateUrl(documentRevision, file, fileType, convertEditable, copyToEditable),
        headers : {
            'Content-Type': 'multipart/form-data; boundary='+boundaryKey,
            'Content-Length' : file.size + Buffer.byteLength(resumableBody + resumableEnd, 'utf-8')
        }
    }, function (response) {
        var data = '';
        response.on('data', function(chunk) {
            data += chunk.toString();
        });
        response.on('end', function() {
            resolve(JSON.parse(data));
        });
        response.on('error', function(err){
            console.error(err);
            reject(err);
        });
    });

    request.write(resumableBody);
    fs.createReadStream(file.path, { bufferSize: 4 * 1024})
        .on('end', function() {
            request.end(resumableEnd);
        })
        .pipe(request, { end: false });

几天来我一直致力于解决这个问题,这是我第一次尝试Scala和Gatling。我在这里错过了什么来得到这个帖子?

一个突出的问题(尽管这可能是一个转移注意力的问题)是,我的应用程序在标题中使用content-length-鉴于Gatling已经省略了它,这有必要吗?如果有必要,我是否可以在加特林中插入该号码而不对其进行硬编码?

在阅读了这篇文章后,我尝试了以下方法:

.exec(http("test post")
            .post("/api/data/files")
            .headers(Headers.headers_6)
            .formParamMap(Map(
                "revisionId" -> "${documentRevisionId}",
                "uploadType" -> "read_only_file",
                "fileType" -> "application%2Fpdf",
                "fileName" -> "testdocument.pdf",
                "fileSize" -> "10080",
                "copyToEditable" -> "true"))
            .bodyPart(StringBodyPart("""{ "resumableChunkNumber": "1",
                "resumableChunkSize": "1048576",
                "resumableCurrentChunkSize": "10080",
                "resumableTotalSize": "10080",
                "resumableType": "application/pdf",
                "resumableIdentifier": "${documentUuid}",
                "resumableFilename": "testdocument.pdf",
                "resumableRelativePath": "testdocument.pdf",
                "resumableTotalChunks": "1" }""")).asJSON
            .bodyPart(RawFileBodyPart("file", "testdocument.pdf")
                .fileName("testdocument.pdf")
                .transferEncoding("binary")).asMultipartForm)

但我还是没有成功。对继续前进有什么建议吗?

共有1个答案

鲁滨海
2023-03-14

如果它对其他人有帮助,我试图在加特林已经这样做的时候设置一个自定义边界。以下是解决我问题的方法:

.exec(http("Post document: upload the file")
            .post("/api/data/files?revisionId=${documentRevisionId}&uploadType=read_only_file&fileType=application%2Fpdf&fileName=testdocument.pdf&fileSize=10080&copyToEditable=true") // ensure testdocument.pdf is in user-files/bodies
            .headers(Headers.headers_6)
            .formParamMap(Map(
                "resumableChunkNumber" -> "1",
                "resumableChunkSize" -> "1048576",
                "resumableCurrentChunkSize" -> "10080",
                "resumableTotalSize" -> "10080",
                "resumableType" -> "application/pdf",
                "resumableIdentifier" -> "${documentUuid}",
                "resumableFilename" -> "testdocument.pdf",
                "resumableRelativePath" -> "testdocument.pdf",
                "resumableTotalChunks" -> "1"))
            .bodyPart(RawFileBodyPart("file", "testdocument.pdf")
                .fileName("testdocument.pdf")
                .transferEncoding("binary")).asMultipartForm)
 类似资料:
  • 我正在使用加特林,我想重复一个命令一个小时,这样我就可以看到在期间有一个操作员

  • Gatling解析Strings参数值并将它们转换为函数,这些函数将根据存储在会话中的数据计算结果,然后对其进行评估。 加特林文件 有没有办法在exec中手动执行此操作? 我有多个使用EL属性的请求体模板,发送的请求将因进纸器而异 我目前拥有的代码如下: 我希望没有办法评估嵌套的EL属性,但是有没有办法使用会话变量手动评估它?类似于 我在其他一些问题中看到过ELCompiler被引用,但不确定从哪

  • 我试着用各种“Rest”和“atOnceUser”进行注射。我在留档上没有找到一个好的解决方案。 我的方法是使用本地计数器创建一个名为“getNextNumber()”的函数,以增加“atOnceUser”的数量,但该函数一开始只调用一次。 有什么想法吗? 我的代码:

  • 我有一个包含JSON数组的JSON文件 测验json 我想针对endpoint测试JSON数组中的每个元素,以观察系统针对唯一有效负载的性能 目前我有 测试ervice.scala 我无法从作为JSON Gatling文档称JSON Feeder将数组的每个元素加载到一个记录集合中 https://gatling.io/docs/2.3/session/feeder/ 即: 并将正文设置为 问题是

  • 我只是试着实施下面的策略,从加特林的CSV反馈器中获取价值。 val csvFeeder=csv(“data/Pet1.csv”)。一批圆形 val csvFeeder=csv(“data/Pet1.csv”)。圆形的 两者似乎都很好。我们什么时候用“.batch.circular”代替“.circular”作为Gatling的喂食策略。 谢谢你的帮助。

  • 我有一个加特林记录,现在我想重复这个场景10次,但我遇到了一些问题,我的重复动作只在第一步启动,不会完成场景的整个步骤。我能知道有什么问题吗?我是否需要在每一步中添加重复(10){}?下面是我的scala代码。

  • 我有一个数组,我想用于2个馈线。我希望每个馈线都能够使用数组中的所有值。但似乎值用完了

  • 我需要在Gatling中发出请求,在其中我能够访问会话项(没有表达式语言)。我需要这样做,因为我想将数据注入到来自csv进纸器的请求中。为了演示我的问题,我有一个小例子(没有会话的实际需要)。 以下场景运行良好: 但那一个没有(我得到异常