如何用Apache Bench(ab)测试上传图片的POST接口?
你之前踩的坑很典型:curl -F发送的是multipart/form-data格式的请求,而你用Postman Echo返回的JSON是响应内容,并非原始的请求体格式,所以用ab发送这个JSON自然会触发服务器错误。下面是正确的操作步骤:
步骤1:捕获curl发送的原始请求体
首先,我们需要拿到curl -F实际发送的请求体内容(包含正确的multipart边界和图片二进制数据)。可以用curl的--trace-ascii参数把请求细节输出到文件:
curl -X POST -F "image=@ta1.jpeg" -F "image=@ta2.jpeg" http://domain.tld/upload --trace-ascii request_trace.txt --output /dev/null
打开生成的request_trace.txt,找到类似下面的请求体部分(从--开头的boundary开始,到最后的--结束):
--------------------------abc123def456
Content-Disposition: form-data; name="image"; filename="ta1.jpeg"
Content-Type: image/jpeg[二进制图片内容]
--------------------------abc123def456
Content-Disposition: form-data; name="image"; filename="ta2.jpeg"
Content-Type: image/jpeg[二进制图片内容]
--------------------------abc123def456--
把这部分内容完整复制出来,保存为一个二进制文件(比如post_body.bin),注意不要用文本编辑器修改二进制内容,避免损坏数据。
步骤2:提取正确的Content-Type头
同样在request_trace.txt里,找到请求头中的Content-Type字段,它会包含自动生成的boundary,格式如下:
Content-Type: multipart/form-data; boundary=------------------------abc123def456
把这个完整的Content-Type值记下来,后面ab命令会用到。
步骤3:用ab发起并发测试
现在用ab的-p参数指定请求体文件,-T参数指定正确的Content-Type,再加上并发数(-c)和总请求数(-n):
ab -n 100 -c 10 -p post_body.bin -T "multipart/form-data; boundary=------------------------abc123def456" http://domain.tld/upload
关键注意事项
- boundary必须完全一致:
-T参数里的boundary要和请求体文件中的boundary完全匹配,包括前面的所有横线。 - 二进制文件完整性:请求体文件要保存为二进制格式,不要用纯文本编辑器编辑,否则图片的二进制数据会被破坏。
- 请求体复用:如果你的测试需要每次上传相同的图片,这个请求体文件可以重复使用;如果需要不同图片,就得重新捕获对应的请求体。
内容的提问来源于stack exchange,提问作者user1981275

