如何使用PHP构造AJAX JSON字符串,以便通过POST发送

如何使用PHP构造AJAX JSON字符串,以便通过POST发送,php,ajax,json,Php,Ajax,Json,我用AJAX编写了一个简单的xmlhttprequest,并想用PHP重建它 var data = {}; var payload = { "flags" : true, "codes" : true, "units" : true }; data.payload = JSON.stringify(payload); $.ajax({ type : 'POST', url : 'http://httpbin.org/post', data : da

我用AJAX编写了一个简单的xmlhttprequest,并想用PHP重建它

var data = {};
var payload = {
    "flags" : true,
    "codes" : true,
    "units" : true
};
data.payload = JSON.stringify(payload);
$.ajax({
    type : 'POST',
    url : 'http://httpbin.org/post',
    data : data,
    success : function(response) {
    var arr = JSON.stringify(response);
    document.getElementById('placeholder').innerHTML = arr;
    }
});
这个很好用

现在,我的PHP版本:

$data = array(
    'payload' => array(
        'flags' => true,
        'codes' => true,
        'units' => true
    )
);

$options = array(
    "http" => array(
        "method" => "POST",
        "header" => "Content-Type: application/json\r\n",
        "content" => json_encode($data)
    )
);

$url = "http://httpbin.org/post";

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
var_dump($response);
当我比较结果时,结构上存在差异。 Ajax如下所示:

{"form":{"payload":"{\"flags\":\"true\",
{"form": {},..."data": "{\"payload\":{\"flags\":\"true\",
PHP如下所示:

{"form":{"payload":"{\"flags\":\"true\",
{"form": {},..."data": "{\"payload\":{\"flags\":\"true\",
为什么PHP中的“表单”是空的? 我尝试了一个额外的数组“form”,但当我查看结果时,字符串中还有第二个“form”。

您是否尝试在对数组编码后立即触发

$options = array(
    "http" => array(
        "method" => "POST",
        "header" => "Content-Type: application/json\r\n",
        "content" => json_encode($data)
    )
);

$error = json_last_error();
echo $error;
如果出现静默json错误,可能会给您一个线索


让我们知道:)

您使用了不正确的方式来构建POST数据

试试这个:

$payload = array(
    'flags' => true,
    'codes' => true,
    'units' => true
);

$data = array(
    'payload' => json_encode($payload)
);

$options = array(
    "http" => array(
        "method" => "POST",
        "header" => "Content-Type: application/x-www-form-urlencoded\r\n",
        "content" => http_build_query($data)
    )
);
解释 在JS代码POST中,数据是一个包含一个键值对的对象
{“payload”:json}
,其中
json
是表示有效负载对象的json编码字符串。此POST数据对象最终(在
$.ajax
实现中)生成一个url编码字符串,如下所示:
有效负载=%7B%22flags%22%3Atrue%2C%22code%22%3Atrue%2C%22units%22%3Atrue%7D


所描述的过程完全由我的php代码重现。

为什么要
JSON.stringify
这个“数据”<代码>$。ajax直接接受完美对象。我只是用“”测试我的请求。但我使用的真正API需要一个JSON字符串。这就是JSON.stringify的原因echo“Error:.json_last_Error();//错误:0似乎正常:(就是这样!你真是个天才!!!我从7个小时开始就试图解决这个问题,但一直没有解决过。但是为什么结果看起来如此不同呢?PHP中的“有效负载”现在看起来和AJAX中的完全不同。但它是行得通的。@Tipo实际上将JS代码结果中的数据发布为与我的PHP代码中相同的外观(字符串)。