xml上传必须用web_custom_request而非web_submit_data,因其可禁用自动url编码、精确控制content-type与原始xml体;关键参数包括method="post"、enctype="text/xml"、contenttype="text/xml; charset=utf-8"及body或bodybinary正确传入转义后的xml字符串。

XML上传必须用 web_custom_request,不能用 web_submit_data
因为 web_submit_data 会自动 URL 编码 body,而 XML 上传通常要求原始 XML 字符串(含标签、空格、换行)原样发送,一旦被编码就变成非法 XML,服务端直接报 400 Bad Request 或 XML parse error。只有 web_custom_request 允许完全控制请求体内容和 Content-Type。
web_custom_request 发送 XML 的关键参数组合
核心是三要素:正确设置 Content-Type、禁用自动编码、显式传入 XML 字符串(非文件路径)。常见错误是把 XML 写成变量但没加引号包裹,或漏掉 EncType 导致乱码。
-
Method必须为"POST"(大小写敏感) -
ContentType推荐设为"text/xml; charset=utf-8"或"application/xml",需和服务端约定一致 -
EncType必须显式设为"text/xml"(不是"application/xml"),否则 LR 可能误判编码方式 -
Body或BodyBinary二选一:
– 纯文本 XML 用Body,内容需用双引号包裹,内部引号需转义
– 含二进制字符或超长 XML,建议先读入lr_eval_string变量再用BodyBinary
实际可运行的 web_custom_request 示例
以下代码模拟上传一段带命名空间的 XML 到 /api/v1/submit:
web_custom_request("XML_Upload",
"URL=http://test-api.example.com/api/v1/submit",
"Method=POST",
"TargetFrame=",
"Resource=0",
"RecContentType=text/xml",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTTP",
"EncType=text/xml",
"ContentType=text/xml; charset=utf-8",
"Body=<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<request xmlns=\"http://example.com/ns\">\n <id>12345</id>\n <data>test&value</data>\n</request>",
LAST);
注意:
– XML 中的 & 必须写成 &(LR 脚本里是双重转义:XML 实体 + C 字符串转义)
– 换行用 \n,不是实际回车;若 XML 太长,建议用 lr_read_file 加载到参数再引用
上传大 XML 或含特殊字符时的避坑点
超过 64KB 的 XML 容易触发 LR 默认缓冲区限制,或因 UTF-8 BOM、BOM 前置空格、不可见控制字符导致解析失败。服务端日志常报 Invalid byte 1 of 1-byte UTF-8 sequence。
- 用文本编辑器(如 VS Code)确认 XML 文件保存为
UTF-8 without BOM - 避免在脚本里拼接 XML,改用
lr_read_file("payload.xml", &buf, &len)读取二进制内容,再传给BodyBinary - 如果服务端要求带
filename的 multipart 表单上传(少见但存在),就不能用web_custom_request,得改用web_submit_data+FILE参数,并确保 XML 文件路径在 LoadRunner 脚本目录下可访问
真正难的不是写对这一行函数,而是确认服务端到底期望什么格式——抓包看真实请求,比文档更可靠。











