如何通过Gatling构造POST请求实现PDF附件上传?
Gatling 实现Resumable分块PDF上传的正确写法
你当前的代码存在3个核心错误:请求路径错把分块上传接口写成了最终表单提交接口、缺少必填分块参数、多余的传输编码头导致后端解析失败。结合你抓包看到的两类请求,实现逻辑必须拆成分块上传和表单提交两个独立步骤,不能合并。
1. 先对齐接口路径
你代码里POST的地址/private/private/private/forms/submit是点击「Save & Continue」触发的最终表单提交接口,不是点击选择文件时触发的分块上传接口。直接把文件发到submit接口100%会失败。
先从浏览器抓包的第一类POST请求(选文件后立刻发出的请求)里复制完整的Request URL,替换掉你当前代码里的post路径。
2. 修正分块上传请求代码
首先确认文件位置:Gatling默认从src/test/resources目录读取静态文件,确保待上传的Caso_SimuladoSC_202.pdf直接放在该目录下,不要嵌套多余文件夹。
你的PDF大小只有10080字节,远小于1MB的分块大小,单块上传即可,正确代码如下:
.exec(http("上传PDF附件分块") .post("/* 替换为你抓包拿到的第一类POST请求的真实路径 */") .headers(shared_headers) // 不要手动设置Content-Type,asMultipartForm会自动生成带正确boundary的请求头 .formParam("resumableChunkNumber", "1") .formParam("resumableChunkSize", "1048576") .formParam("resumableCurrentChunkSize", "10080") // 必须和实际文件字节数完全一致 .formParam("resumableTotalSize", "10080") .formParam("resumableType", "application/pdf") // 注意:你之前的代码漏了必填的resumableIdentifier参数,单块场景下一般格式为「文件大小-文件名」 .formParam("resumableIdentifier", "10080-Caso_SimuladoSC_202.pdf") .formParam("resumableFilename", "Caso_SimuladoSC_202.pdf") .formParam("resumableRelativePath", "Caso_SimuladoSC_202.pdf") .formParam("resumableTotalChunks", "1") .bodyPart( RawFileBodyPart("file", "Caso_SimuladoSC_202.pdf") .fileName("Caso_SimuladoSC_202.pdf") .contentType("application/pdf") // 显式指定文件类型,避免被识别为二进制流 // 删掉你之前写的.transferEncoding("binary"),绝大多数后端不识别该头,会直接导致文件解析失败 ) .asMultipartForm // 加校验,确认上传成功,同时提取后端返回的文件ID供后续提交使用 .check(status.is(200)) .check(jsonPath("$.fileId").saveAs("uploadedFileId")) // 按你实际接口返回的字段路径调整 )
3. 补充最终表单提交请求
分块上传完成后,再发第二类POST请求(即submit接口),这一步不需要再携带文件实体,只需要传两类参数:
- 表单本身的业务字段:下拉框、文本框、复选框的取值
- 上一步上传成功后拿到的文件ID:作为关联参数传给submit接口,告诉后端这个表单绑定的是哪个已上传的附件
示例代码片段:
.exec(http("保存表单并进入下一步") .post("/private/private/private/forms/submit") .headers(shared_headers) // 其他表单字段按你之前的逻辑填充 .formParam("attachmentId", "${uploadedFileId}") // 传入上一步拿到的文件ID .asFormUrlEncoded .check(status.is(200)) )
常见踩坑说明
- 两个请求的顺序不能调换:必须等分块上传接口返回成功(拿到文件ID)之后,再发submit请求
- 如果后续测试更大的文件(超过1MB分块大小),不能写死单块上传,需要先计算总分块数,循环逐块上传对应字节区间的文件内容
- 不要在shared_headers里手动写死
Content-Length,Gatling会自动计算请求长度,硬编码会导致请求被后端拒绝 - 如果分块上传返回400/500,先对比你发的请求参数和浏览器抓包里的参数,重点检查有没有漏带cookie、csrf token这类鉴权字段
内容的提问来源于stack exchange,提问作者aps
相关产品推荐
相关产品推荐

