httr::POST发送XML文件必须显式设置Content-Type为"application/xml"或"text/xml",否则服务端无法识别;需用readBin读取UTF-8无BOM文件并设encode="raw",配合content_type()覆盖默认类型,避免乱码与解析失败。

httr::POST 发送 XML 文件必须设对 Content-Type
默认情况下 httr::POST() 会把文件当二进制流发,服务端收不到合法 XML。关键不是“怎么传文件”,而是“怎么让服务端知道这是 XML”。Content-Type 必须显式设为 "application/xml" 或 "text/xml",不能依赖自动推断。
- 用
upload_file()读取本地 XML 文件,它返回一个 raw 向量 + content-type 元数据,但这个元数据默认是"application/octet-stream" - 必须用
content_type("application/xml")覆盖掉它,否则后端解析失败(常见报错:400 Bad Request / “Invalid XML”) - 如果 XML 有中文,确保文件本身是 UTF-8 编码,且不带 BOM;否则部分 API 会拒收
完整 POST XML 示例:含错误处理和编码检查
下面这段代码做了三件事:校验文件编码、强制指定 XML 类型、捕获 HTTP 错误响应。跳过任一环节都可能静默失败。
library(httr)xml_path <- "data/request.xml" xml_raw <- readBin(xml_path, what = "raw", n = file.info(xml_path)$size)
检查是否 UTF-8(简单判断:不含 0xFF 0xFE 或 0xEF 0xBB 0xBF)
if (length(xml_raw) >= 2 && xml_raw[1] == 0xFF && xml_raw[2] == 0xFE) { stop("XML 文件含 UTF-16 BOM,httr 不支持,请转为 UTF-8 无 BOM") }
resp <- POST( url = "https://www.php.cn/link/1e2d681b253cb12c33f7b4823af01d79", body = xml_raw, encode = "raw", content_type("application/xml"), accept("application/xml") )
if (http_error(resp)) { cat("HTTP 错误:", status_code(resp), "\n") cat("响应体:", content(resp, "text"), "\n") } else { cat("成功,响应:", content(resp, "text"), "\n") }
body 参数选 raw 还是 upload_file?
二者都能传,但行为不同:
-
body = upload_file("x.xml"):自动设Content-Type: application/octet-stream,需额外加content_type("application/xml")覆盖 -
body = readBin(...)+encode = "raw":完全手动控制,更可靠,避免中间层干扰 - 不要用
body = "字符串直传——R 默认用本地 locale 编码,遇到非 ASCII 字符极易乱码... "
调试时怎么看实际发出的请求?
用 verbose() 看真实 header 和 body 长度,比猜强得多:
睿拓智能网站系统-睿拓企业网站系统1.2免费版软件大小:6M运行环境:asp+access本版本是永州睿拓信息企业网站管理系统包括了企业网站常用的各种功能,带完整的后台管理系统,本程序无任何功能限制下载即可使用,具体功能如下。1.网站首页2.会员注册3.新闻文章模块4.产品图片展示模块5.人才招聘模块6.在线留言模块7.问卷调查模块8.联系我们模块9.在线QQ客服系统10.网站流量统计系统11.后
resp <- POST(
url = "https://www.php.cn/link/1e2d681b253cb12c33f7b4823af01d79",
body = xml_raw,
encode = "raw",
content_type("application/xml"),
verbose(info = TRUE, ssl = TRUE)
)重点核对:> POST /submit HTTP/1.1 后是否出现 Content-Type: application/xml,以及 Content-Length 是否与 length(xml_raw) 一致。不一致说明 body 被二次编码了。
XML POST 的麻烦点不在语法,而在编码链路太长:文件存储编码 → R 读取方式 → httr body 处理 → HTTP header 声明 → 服务端解析器。漏掉任意一环,错误信息都指向“XML 格式错误”,实际根本不是格式问题。









