XML上传不必须用multipart/form-data,但多数老系统或政务/金融接口要求该格式;k6需手动构造boundary、header和body,body为ArrayBuffer类型;验证需检查响应体业务字段而非仅状态码;并发时XML内容应动态生成以避免重复。
不是必须,但绝大多数 XML 上传接口(尤其是老系统或政务/金融类)要求 Content-Type: multipart/form-data,因为文件需作为二进制 part 提交。如果后端明确支持 application/xml 或 text/xml 直接 POST 原始 XML 字符串,k6 可跳过 form 构建——但这种情况较少,先默认按 multipart 处理。
k6 的 http.request() 不支持自动序列化 multipart,必须手动拼接 boundary、header 和 body。关键点:
boundary 需随机生成(如用 crypto.randomUUID()),且不能出现在 XML 内容中Content-Disposition 必须含 name="file"(或后端约定的字段名)和 filename="xxx.xml"
\r\n\r\n),结尾需以 --{boundary}-- 结束ArrayBuffer 类型,不能传字符串——要用 new TextEncoder().encode(str)
import http from 'k6/http';
import { crypto } from 'k6';
export default function () {
const xmlContent = `123 99.9 `;
const boundary = `----k6-${cry
pto.randomUUID()}`;
const dashBoundary = `--${boundary}`;
const body = [
dashBoundary,
'Content-Disposition: form-data; name="file"; filename="data.xml"',
'Content-Type: application/xml',
'',
xmlContent,
dashBoundary + '--',
''
].join('\r\n');
const params = {
headers: {
'Content-Type': `multipart/form-data; boundary=${boundary}`,
},
};
http.post('https://api.example.com/upload', new TextEncoder().encode(body), params);
}
仅看 HTTP 状态码 200 不够。常见陷阱:
"status": "success" 或类似业务字段filename 或字段名错(如传 name="xml" 但后端期待 name="upload"),会导致后端收不到文件——抓包对比真实请求最可靠需要。静态 XML 在高并发下容易触发后端幂等校验或重复拒绝。推荐方式:
__ENV.TEST_ID 或 __VU + __ITER 拼出唯一 值${Date.now()}
边界情况容易被忽略:当 XML 含特殊字符(如 &、)时,若手动生成字符串未转义,会破坏 XML 结构;此时应优先用模板字符串拼接,而非从外部读取未清洗的原始内容。