我有一个简单的使用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中“表单”为空? 我已经尝试了一个额外的数组“表单”,但是当我查看结果时,字符串中有第二个“表单”。
答案 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错误,也许它可以给你一个线索。
告诉我们:)