在接口开发场景中,除了常见的JSON格式请求体,XML格式的数据传输也十分普遍,PHP要接收XML请求体需要借助特定的函数和方法,下面介绍具体的实现方式。

方式一:读取原始输入流获取XML内容
PHP可以通过php://input输入流直接读取请求的原始内容,这种方式可以获取到包括XML在内的所有非 multipart/form-data 格式的请求体数据。
示例代码如下:
<?php
// 读取原始请求体内容
$xmlRaw = file_get_contents('php://input');
// 判断是否有内容
if (empty($xmlRaw)) {
echo '未接收到XML请求体';
exit;
}
// 输出原始XML内容
echo '接收到的原始XML内容:' . $xmlRaw;
?>
这种方式获取的是最原始的字符串,后续可以根据需求自行处理,比如验证XML格式、解析节点内容等。
方式二:解析XML请求体为对象或数组
获取到原始XML字符串后,我们可以使用PHP内置的SimpleXML扩展或者DOMDocument类来解析XML内容,方便后续的业务逻辑处理。
使用SimpleXML解析
SimpleXML是PHP自带的处理XML的扩展,使用起来比较简单,适合结构不复杂的XML解析。
示例代码:
<?php
$xmlRaw = file_get_contents('php://input');
if (empty($xmlRaw)) {
echo '未接收到XML请求体';
exit;
}
// 禁止加载外部实体,避免XXE漏洞
libxml_disable_entity_loader(true);
// 解析XML字符串为SimpleXMLElement对象
$xmlObj = simplexml_load_string($xmlRaw, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($xmlObj === false) {
echo 'XML格式解析失败';
exit;
}
// 转换为数组方便使用
$xmlArray = json_decode(json_encode($xmlObj), true);
// 输出解析后的内容
echo '解析后的XML数组:';
print_r($xmlArray);
?>
使用DOMDocument解析
如果XML结构比较复杂,或者需要更灵活的节点操作,可以使用DOMDocument类来解析。
示例代码:
<?php
$xmlRaw = file_get_contents('php://input');
if (empty($xmlRaw)) {
echo '未接收到XML请求体';
exit;
}
$dom = new DOMDocument();
// 加载XML字符串
if (!$dom->loadXML($xmlRaw)) {
echo 'XML格式加载失败';
exit;
}
// 获取根节点名称
$rootNodeName = $dom->documentElement->nodeName;
echo 'XML根节点名称:' . $rootNodeName . '<br/>';
// 获取指定节点内容,假设XML中有user节点
$userNodes = $dom->getElementsByTagName('user');
if ($userNodes->length > 0) {
$userNode = $userNodes->item(0);
$userName = $userNode->getElementsByTagName('name')->item(0)->nodeValue;
echo '用户名:' . $userName;
}
?>
注意事项
- 接收XML请求体时,要确认客户端的请求头
Content-Type设置为application/xml或者text/xml,避免请求体读取异常。 - 解析XML时一定要禁用外部实体加载,防止XXE注入攻击,保障接口安全。
- 如果XML请求体过大,需要注意PHP的
post_max_size和upload_max_filesize配置,避免请求体被截断。
完整示例:接收并响应XML请求
下面是一个完整的接口示例,接收客户端发送的XML请求,解析后返回XML格式的响应:
<?php
// 设置响应头为XML格式
header('Content-Type: application/xml; charset=utf-8');
// 读取XML请求体
$xmlRaw = file_get_contents('php://input');
if (empty($xmlRaw)) {
// 返回错误XML
echo '<?xml version="1.0" encoding="utf-8"?><response><code>400</code><msg>未接收到XML请求体</msg></response>';
exit;
}
// 解析XML
libxml_disable_entity_loader(true);
$xmlObj = simplexml_load_string($xmlRaw, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($xmlObj === false) {
echo '<?xml version="1.0" encoding="utf-8"?><response><code>400</code><msg>XML格式错误</msg></response>';
exit;
}
// 处理业务逻辑,假设获取请求中的order_id
$orderId = (string)$xmlObj->order_id;
// 返回成功响应
echo '<?xml version="1.0" encoding="utf-8"?>';
echo '<response>';
echo '<code>200</code>';
echo '<msg>接收成功</msg>';
echo '<order_id>' . $orderId . '</order_id>';
echo '</response>';
?>
PHPXMLrequest_bodyinput_streamSimpleXML修改时间:2026-06-19 11:15:18