使用JavaScript和PHP POST XML数据时$_POST为空的解决方法
问题分析与解决:POST发送XML数据后PHP无法获取$_POST内容
问题重现
尝试通过POST方法发送XML数据,使用以下JavaScript代码:
let httpreq = new XMLHttpRequest(); httpreq.open('POST',url,false); httpreq.setRequestHeader("Content-Type", "application/xml"); httpreq.send("'xml'" + '=' + encodeURIComponent(xmlString));
但PHP端无法从$_POST中读取数据:
fwrite($fp,'string size ' . sizeof($_POST) . PHP_EOL); // 写入结果为0 $xmlString = $_POST['xml']; // 提示Undefined index: xml
使用GET方法发送小体积XML(如下示例)可正常处理,但大体积XML会被拒绝:
<?xml version='1.0' encoding='UTF-8'?> <model> <modelName>azsxdc</modelName> <cadSpline> <cadType>'cadSpline'</cadType> <id>'spline0'</id> <cls>'spline'</cls> <stroke>'black'</stroke> <strokeWidth>'3'</strokeWidth> <cadPoint> <xval>'59.641'</xval> <yval>'440'</yval> <zval>'0'</zval> <id>'splPoint0'</id> </cadPoint> <cadPoint> <xval>'157.641'</xval> <yval>'475'</yval> <zval>'0'</zval> <id>'splPoint1'</id> </cadPoint> <cadPoint> <xval>'233.641'</xval> <yval>'467'</yval> <zval>'0'</zval> <id>'splPoint2' </id> </cadPoint> </cadSpline> </model>
核心问题原因
- 请求头与发送数据格式不匹配:设置了
Content-Type: application/xml,但实际发送的是xml=编码后的XML这种表单键值对格式 - PHP仅自动解析
application/x-www-form-urlencoded或multipart/form-data格式的请求到$_POST,application/xml格式的原始数据不会被解析到该变量中
两种可行解决方案
方案一:改用表单格式发送(适配PHP自动解析)
修改JS代码,统一请求头与数据格式,同时修正参数的多余单引号:
let httpreq = new XMLHttpRequest(); httpreq.open('POST', url, false); // 设置表单类型的Content-Type httpreq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 直接发送键值对格式数据,去掉参数名的单引号 httpreq.send("xml=" + encodeURIComponent(xmlString));
修改后PHP端可直接通过$_POST['xml']获取XML内容,无需额外处理。
方案二:直接发送原始XML数据(纯XML场景)
若需严格以application/xml格式发送,PHP端需读取原始请求体:
JS代码修改:
let httpreq = new XMLHttpRequest(); httpreq.open('POST', url, false); httpreq.setRequestHeader("Content-Type", "application/xml"); // 直接发送原始XML字符串,无需包装成键值对 httpreq.send(xmlString);
PHP端处理:
// 读取POST原始请求体 $xmlString = file_get_contents('php://input'); // 可选:验证XML格式 libxml_use_internal_errors(true); $xml = simplexml_load_string($xmlString); if (!$xml) { $errors = libxml_get_errors(); // 处理XML解析错误逻辑 }
补充说明
- GET方法受URL长度限制(通常几KB),大体积XML必须使用POST方法
- 方案一兼容性更强,适合需混合发送其他表单参数的场景;方案二更符合纯XML API的设计规范
内容的提问来源于stack exchange,提问作者user25318123
相关产品推荐
相关产品推荐

