Content-Type 必须设为 application/xml 或 text/xml;application/xml 优先,禁用 charset 后缀;cURL 用 --data-binary 和 -H 指定头;Python requests 需 encode 字符串并手动设 headers。

Content-Type 必须设为 application/xml 或 text/xml
浏览器或 HTTP 客户端默认不会识别 XML 内容类型,如果漏设或错设(比如用 application/json),服务端很可能直接拒收或解析失败。多数 REST API 明确要求 Content-Type: application/xml,少数老系统接受 text/xml,但二者语义不同:application/xml 表示不可见的二进制安全格式,text/xml 暗示可被文本编辑器处理——实际中优先试 application/xml。
注意:不要加 charset 后缀(如 application/xml; charset=utf-8),除非服务端明确要求。很多 Java Spring Boot 接口反而因带 charset 导致 415 Unsupported Media Type。
cURL 发送 XML 的最小可行命令
用 curl 测试最直接,避免框架干扰。关键点是禁用表单编码、手动指定头、从文件读取或内联 XML:
curl -X POST https://www.php.cn/link/f142c6067e6345134c6728f299cf4c1e \ -H "Content-Type: application/xml" \ --data-binary @payload.xml \ -v
说明:
-
--data-binary保证原始字节发送,不转义换行或特殊字符;-d会做 URL 编码,XML 会损坏 -
@payload.xml表示读取本地文件;若内联 XML,改用单引号包裹并换行(注意 shell 对和>的解析) -
-v查看真实请求头和响应,确认Content-Type和长度是否符合预期
Python requests 发送 XML 的典型写法
requests 默认把 data 当作表单提交,必须显式传入字符串或 bytes,并控制 headers:
import requestsxml_content = """
通吃客零食网整站 for Shopex下载第一步】:将安装包中所有的文件夹和文件用ftp工具以二进制方式上传至服务器空间;(如果您不知如何设置ftp工具的二进制方式,可以查看:(http://www.shopex.cn/support/qa/setup.help.717.html)【第二步】:在浏览器中输入 http://您的商店域名/install 进行安装界面进行安装即可。【第二步】:登录后台,工具箱里恢复数据管理后台是url/sho
""" 123 book response = requests.post( "https://www.php.cn/link/f142c6067e6345134c6728f299cf4c1e", data=xml_content.encode("utf-8"), # 必须 encode,否则 requests 可能自动加 charset headers={"Content-Type": "application/xml"} )
常见错误:
- 直接传
data=xml_content(str 类型)→ requests 自动加charset=utf-8,触发 415 - 用
json=...参数 → 自动设application/json头,服务端直接 400 - XML 中含未转义
&或→ 解析失败,应在生成时确保合法(用xml.etree.ElementTree构建更安全)
浏览器 FormData 无法直接发纯 XML
前端若想用 JS 发送 XML,不能依赖 FormData(它强制 multipart/form-data 编码)。必须用 fetch 原生发送 raw body:
const xmlString = ``; fetch("/api/upload", { method: "POST", headers: { "Content-Type": "application/xml" }, body: xmlString }); Alice
注意:
- XML 字符串必须是合法 UTF-8 编码,浏览器不校验语法,但服务端会报
XML parse error如果有 BOM 或编码不匹配 - 若 XML 来自用户上传的文件,用
FileReader.readAsText(file, "UTF-8")读取,再传给body - 跨域时,服务端需返回
Access-Control-Allow-Headers: Content-Type,否则预检失败
XML 的 HTTP 传输本身不复杂,难点常在服务端对 MIME 类型的严格校验、编码一致性、以及客户端误用表单提交逻辑。实际调试时,先用 curl -v 确认基础通路,再逐步加语言封装。










