You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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>

核心问题原因

  1. 请求头与发送数据格式不匹配:设置了Content-Type: application/xml,但实际发送的是xml=编码后的XML这种表单键值对格式
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:52:08