最稳方式是用 --data-binary @file.xml 传 xml 文件,避免 shell 解析问题;必须显式设 content-type: application/xml,非文件传输需严格转义并单引号包裹;php 要防 bom 和自动编码,python 需传 bytes 并禁用 url 编码。

curl 命令里怎么正确传 XML 内容
直接用 -d 传原始 XML 字符串最容易出错——换行、引号、特殊字符全会破坏结构。必须用 --data-binary 配合文件输入,或严格转义后用 -d。
-
--data-binary @file.xml是最稳的方式,@表示读取文件二进制内容,不处理换行和空格 - 如果非要用字符串,得把整个 XML 放在单引号里,并手动转义所有单引号(
'→\'),否则 shell 会提前截断 - 别用
-d加双引号包裹 XML:shell 会吃掉内部的换行,服务器收到的是压成一行的非法 XML - 记得加
-H "Content-Type: application/xml",很多接口靠这个头判断数据格式,缺了直接 415 错误
PHP 里用 curl_exec 发送 XML 要注意什么
PHP 的 curl_setopt 对二进制数据很敏感,XML 里的 UTF-8 BOM、多余空格、换行都会让某些老接口拒绝解析。
- XML 字符串必须是纯 UTF-8,且**不能带 BOM**;用
file_get_contents读文件时加FILE_BINARY标志更安全 - 设置
CURLOPT_POSTFIELDS为字符串时,确保没被trim()或自动编码干扰;设为数组会触发 multipart,绝对不行 - 务必显式设置
CURLOPT_HTTPHEADER包含Content-Type: application/xml,不能依赖 cURL 自动推断 - 有些接口要求
Content-Length头,PHP 通常自动算,但如果用了CURLOPT_UPLOAD模式就得自己算并设置
收到 400 或 415 错误时先查哪几件事
这类错误基本不是网络问题,而是请求体或头信息没对上服务端预期。
- 检查响应头里的
Content-Type是否真发了application/xml,用-v参数看 curl 实际发出的头 - 用
curl -v -X POST -H "Content-Type: application/xml" --data-binary @test.xml http://api/复现,观察>开头的原始请求体是否完整、无截断 - 服务端日志如果显示“invalid XML”或“not well-formed”,大概率是 XML 本身有语法错——用
xmllint --noout test.xml验证 - 某些 Java 后端(如 Spring)默认只接受
text/xml,换成这个类型试试,而不是死守application/xml
Python requests.post 怎么避免 XML 变形
requests 默认会对 data 参数做 URL 编码,XML 一编码就废了。必须绕过这一层。
- 用
data=xml_string.encode('utf-8'),而不是data=xml_string;否则 requests 会当表单处理 -
headers={'Content-Type': 'application/xml'}必须显式传,不能省略 - 别用
json=...或files=...,这两个参数会强制改写请求体结构 - 如果 XML 来自文件,用
open('file.xml', 'rb').read()直接读字节流,比read().encode()更可靠
&、一个错位的 Content-Type 头,都够卡住一整天。真正麻烦的往往不是怎么发,而是怎么确认发出去的和你本地看到的一模一样。










