Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用POST方法从javascript向服务器发送json数据时出现问题_Php_Javascript_Ajax_Json - Fatal编程技术网

Php 使用POST方法从javascript向服务器发送json数据时出现问题

Php 使用POST方法从javascript向服务器发送json数据时出现问题,php,javascript,ajax,json,Php,Javascript,Ajax,Json,我试图查看我使用XMLHttpRequest发送到服务器的json数据,但服务器似乎没有接收到它,当我运行javascript时,会弹出警报窗口,但不会打印任何内容。有人知道如何解决这个问题吗?谢谢 在客户端,Java脚本 var obj = {"action": "nothing"}; var jsonString = "jsonString=" + JSON.stringify(obj); var xmlhttp = new XMLHttpRequest(); xmlhttp.ope

我试图查看我使用XMLHttpRequest发送到服务器的json数据,但服务器似乎没有接收到它,当我运行javascript时,会弹出警报窗口,但不会打印任何内容。有人知道如何解决这个问题吗?谢谢

在客户端,Java脚本

var obj = {"action": "nothing"};

var jsonString = "jsonString=" + JSON.stringify(obj);


var xmlhttp = new XMLHttpRequest();

xmlhttp.open("POST","http://myserver/main.php",true);

xmlhttp.setRequestHeader("Content-type","application/json");
xmlhttp.setRequestHeader("Content-Length",jsonString.length);

xmlhttp.onreadystatechange = function() 
{           
      if(xmlhttp.readyState === 4 && xmlhttp.status === 200){
          alert(xmlhttp.responseText);
      }
}
xmlhttp.send(jsonString);
在服务器上,php

if(isset($_POST['jsonString'])) 
echo $_POST['jsonString'];

您正在发送JSON数据,但内容类型设置为
application/x-www-form-urlencoded
。您应该发送表单/编码数据(
var obj=“action=nothing”
),或者将内容类型设置为JSON(
application/JSON

这对我来说很有效:

<html>
<head>
<script src='json.js'></script>
</head>
<body>

<script>
var obj = {"action": "nothing"};
var jsonString = "jsonString=" + JSON.stringify(obj);
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST","whereIPutThePHP.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-Length",jsonString.length);

xmlhttp.onreadystatechange = function() 
{           
      if(xmlhttp.readyState === 4 && (xmlhttp.status === 200)){
          alert(xmlhttp.responseText);
      } 
}
xmlhttp.send(jsonString);
</script>

</body>
</html>

var obj={“action”:“nothing”};
var jsonString=“jsonString=“+JSON.stringify(obj);
var xmlhttp=new XMLHttpRequest();
open(“POST”,“whereIPutThePHP.php”,true);
setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”);
setRequestHeader(“内容长度”,jsonString.Length);
xmlhttp.onreadystatechange=函数()
{           
if(xmlhttp.readyState==4&&(xmlhttp.status==200)){
警报(xmlhttp.responseText);
} 
}
send(jsonString);

James的解决方案工作得很好,但是如果您希望使用application/json内容类型发送数据,那么您必须以不同的方式访问数据

对于服务器端的内容

if(isset($_POST['jsonString'])) 
echo $_POST['jsonString'];
改变这一点(就像詹姆斯所做的那样):

如果要使用application/json内容类型,则必须通过以下方式更改访问it服务器端的方式:

    $json_string = file_get_contents('php://input');
    $json_object = json_decode($json_string); 
    echo $json_object->action;

application/x-www-form-urlencoded
意味着您必须对字符串进行urlencode:
encodeURIComponent(JSON.stringify(obj))
。您还应该发送一个内容长度:
xmlhttp.setRequestHeader(“内容长度”,jsonString.Length)。并检查
xmlhttp.status==200
中的
xmlhttp.onreadystatechange
@Saxoier谢谢你,我刚刚根据你的说明编辑了我的代码,但不幸的是它仍然不工作。你的第一个版本已经工作了。也许您可以使用apache的mod_rewrite(
RewriteRule
,…)或mod_别名(
redirect
,…)进行重定向。然后,您可能会发出一个额外的GET请求并丢失所有POST数据。看看Firebug->Network。此请求不应该有3xx HTTP状态代码。谢谢,我刚刚将其更改为application/json,但仍然不起作用
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    $json_string = file_get_contents('php://input');
    $json_object = json_decode($json_string); 
    echo $json_object->action;