如何使用PHP构建一个AJAX JSON字符串以使用POST发送

时间:2014-02-19 13:38:25

标签: 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 : 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\",

和PHP看起来像这样:

{"form": {},..."data": "{\"payload\":{\"flags\":\"true\",

为什么在PHP中“表单”为空? 我已经尝试了一个额外的数组“表单”,但是当我查看结果时,字符串中有第二个“表单”。

2 个答案:

答案 0 :(得分:1)

您使用不正确的方法来构建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编码的字符串,如下所示:payload=%7B%22flags%22%3Atrue%2C%22codes%22%3Atrue%2C%22units%22%3Atrue%7D

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

答案 1 :(得分:0)

您是否尝试在编码阵列后立即触发json_last_error()

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

$error = json_last_error();
echo $error;

如果出现无声的json错误,也许它可以给你一个线索。

告诉我们:)