我想用POST发送JSON对象
var user = {
"first_name": first_name.value,
"last_name": last_name.value,
"age": age.value,
"email": email.value
};
下面是我发送对象的方式:
var request;
var url = 'ajax_serverside_JSON.php';
var destination;
function ajax_call(src, jsonObj, dst, method) {
this.src = src;
destination = dst;
this.objJSON = jsonObj;
this.request = getXMLHttpRequest();
this.request.onreadystatechange = getResponse;
if (method == 'POST') {
sendPostRequest(objJSON);
}
return;
}
function sendPostRequest(objJSON) {
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
request.send(JSON.stringify(objJSON));
return;
}
function getXMLHttpRequest() {
try {
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera,Safari
request = new XMLHttpRequest();
} else {
// code for IE6, IE5
request = new ActiveXObject("Microsoft.XMLHTTP");
}
} catch (e) {
alert('The browser doesn\'t support AJAX: ' + e);
request = false;
}
return request;
}
function getResponse() {
if (request.readyState == 4 && request.status == 200) {
document.getElementById(destination).innerHTML += request.response;
}
}
问:如何在服务器端PHP中读取对象?发送的JSON的键是什么?echo var_dump ( $_POST )
;显示
array (size=0)
empty
出了什么问题?
- 编辑后**
我将代码更改为:
this.objJSON = jsonObj;
以及
request.send("user=" + JSON.stringify(this.objJSON));
我尝试读取JSON对象:
<?php
if (isset ( $_POST ['user'] )) {
$obj = json_decode ( $_POST ['user'] );
echo "isset";
} else {
echo "is not set ";
echo var_dump ( $_POST );
}
?>
......但还是一样:
is not set
array (size=0)
empty
6条答案
按热度按时间iyr7buue1#
我不确定PHP是否能自动将JSON解析为
$_POST
变量,你应该将JSON放入一个普通POST变量的值中:并使用默认的Content-Type。然后在PHP中你可以:
您还需要修复一个Javascript变量,正如Niels Keurentjes的回答中所解释的那样。
ryevplcw2#
将函数分解为核心的3行:
jsonOBJ
在局部作用域中设置为变量。将
jsonOBJ
复制到this.objJSON
。仍然没有局部变量
objJSON
,因为Javascript不会自动将this
视为局部作用域的一部分,因此发送null,因此发送空的$_POST
。发送
jsonOBJ
或this.objJSON
,它将工作正常。ars1skjm3#
试试看:
它是一个键值对,我猜您缺少键。
nle07wnf4#
对于原始 AJAX 请求,必须从
php://input
读取请求主体并解码。3wabscal5#
uelo1irk6#
我将试图澄清最初的问题,并可能澄清一些潜在的混淆。Rosca的问题或混淆是,当发布JSON对象时,$_POST在PHP中不起作用。原因是,最初的请求虽然是作为post完成的,但并不是作为标准的“forms”post请求发送的。在标准的forms post中,请求内容类型应该是“应用程序/x-www-form-urlencoded”而不是“应用程序/json”。此外,post请求的主体应该是url编码的查询字符串,而不是JSON编码的字符串。它们的格式不同。查询字符串可能类似于id=134626&type=car,其中JSON编码的字符串看起来像[“id”=“134526”,“type”:“car”]。因为原始请求的发送方式,它发送的是JSON对象数据,而不是URL编码的表单数据。所以,当您执行类似$_POST[“id”]的操作时,PHP会返回一个错误,因为没有发送表单数据。其他人提供的建议是让PHP读取请求正文,并将其作为JSON对象处理。如果您将post请求作为JSON对象发送,并在服务器端将其作为JSON对象处理,这将非常好用!
您可以做的另一件事是将数据作为url编码的表单数据内容发送(application/x-www-form-urlencoded),将数据添加为有效的查询字符串,并在服务器端将其作为标准表单发布请求进行处理。如果您这样做,则是的,你可以在PHP中使用$_POST[“id”]来获取“id”参数的值。下面是一些将JSON对象转换为查询字符串的javascript代码:
在上面的例子中,“params”是您想要转换为queryString的json对象。
下面是如何在Rosca的代码中进行这些更改,以便像标准表单帖子一样发送:
将请求作为标准表单请求发送的优点是,您可以轻松地创建一个简单的html页,用于测试执行post操作的页。