php 8.1 发送 xml post 请求的核心是正确构造合法 utf-8 xml 字符串并用 curl 设置 content-type: text/xml; charset=utf-8、curlopt_postfields 直接传字符串、curlopt_post=true;服务端必须用 file_get_contents('php://input') 读取并解析,不可依赖 $_post。

PHP 8.1 发送 XML 数据走 POST 请求,核心是两点:正确构造 XML 字符串、用 curl 设置合适的请求头和原始数据体。不能依赖 $_POST,因为 PHP 默认不解析 text/xml 类型的请求体。
确保 XML 内容格式规范
XML 字符串需合法且编码明确,推荐显式声明 UTF-8 编码:
- 开头加上
<?xml version="1.0" encoding="UTF-8"?> - 避免未转义的特殊字符(如
&、、<code>>),可用htmlspecialchars()或 CDATA 包裹文本内容 - 标签闭合要严格,例如
<content></content>
用 curl 发送(推荐方式)
这是最稳定、可控性最强的方法。关键设置包括指定 Content-Type、禁用自动 body 编码、启用返回值捕获:
-
CURLOPT_HTTPHEADER必须包含"Content-type: text/xml; charset=utf-8" -
CURLOPT_POSTFIELDS直接传入 XML 字符串(不是数组) -
CURLOPT_POST设为true,CURLOPT_RETURNTRANSFER设为true - 建议加
CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT防卡死
示例代码:
(注意:PHP 8.1 中$HTTP_RAW_POST_DATA 已彻底移除,接收端必须用 file_get_contents('php://input'))
服务端接收 XML 的正确写法
接收方不能用 $_POST,而应读取原始输入流:
-
$raw = file_get_contents('php://input');—— 这是唯一可靠方式 - 解析前建议校验字符串非空,并用
libxml_disable_entity_loader(true)防 XXE 攻击 - 再用
simplexml_load_string($raw)或DOMDocument::loadXML()解析
常见错误与规避
实际调试中容易踩坑的地方:
- 漏设
Content-Type头 → 对方可能按application/x-www-form-urlencoded解析失败 - XML 含中文但没声明
encoding="UTF-8"→ 接收端解析乱码 - 使用
curl_setopt($ch, CURLOPT_POSTFIELDS, $array)传数组 → XML 被自动 urlencode,变成不可读字符串 - 未检查
curl_exec()返回值是否为false,也未调用curl_error()查错
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











