从Javascript发送JSON数据到PHP?

我怎么能从浏览器中的Javascript发送JSON数据到服务器,并让PHPparsing它?

我在这里得到了很多信息,所以我想发布一个我发现的解决scheme。

问题是:从浏览器的Javascript中获取JSON数据到服务器,并让PHP成功parsing它。

环境: Windows中的浏览器(Firefox)中的Javascript。 LAMP服务器作为远程服务器:Ubuntu上的PHP 5.3.2。

什么可行(版本1):
1)JSON只是文本。 文本以某种格式,但只是一个文本string。

2)在JavaScript中, var str_json = JSON.stringify(myObject)给了我JSONstring。

3)我使用Javascript中的AJAX XMLHttpRequest对象将数据发送到服务器:
request= new XMLHttpRequest()
request.open("POST", "JSON_Handler.php", true)
request.setRequestHeader("Content-type", "application/json")
request.send(str_json)
[... code to display response ...]

4)在服务器上,PHP代码读取JSONstring:
$str_json = file_get_contents('php://input');
这读取原始POST数据。 $str_json现在包含来自浏览器的确切的JSONstring。

什么工作(版本2):
1)如果我想使用"application/x-www-form-urlencoded"请求头,我需要创build一个标准的POSTstring"x=y&a=b[etc]"这样当PHP得到它时,它可以把它放在$ _POST关联数组中。 所以,在浏览器中使用Javascript:

var str_json = "json_string=" + (JSON.stringify(myObject))

当我通过AJAX / XMLHttpRequest发送str_json时,PHP现在可以填充$ _POST数组,如上面的版本1所示。

显示$_POST['json_string']将显示JSONstring。 使用jsonstring在$ _POST数组元素上使用json_decode()将正确解码数据并将其放入数组/对象中。

我遇到的陷阱:
最初,我尝试使用application / x-www-form-urlencoded的头部发送JSONstring,然后尝试立即从PHP中的$ _POST数组中读取它。 $ _POST数组总是空的。 那是因为它期望的数据forms为yval = xval&[rinse_and_repeat]。 它没有发现这样的数据,只有JSONstring,它只是把它扔掉。 我检查了请求标题,并正在发送POST数据。

同样,如果我使用application / json头,我再次无法通过$ _POST数组访问发送的数据。 如果你想使用application / json content-type头,那么你必须通过php://input,而不是用$ _POST访问PHP中原始的POST数据。

参考文献:
1)如何在PHP中访问POST数据: 如何在PHP 中访问POST数据?
2)有关application / jsontypes的细节,以及一些可以转换为JSONstring并发送到服务器的示例对象: http : //www.ietf.org/rfc/rfc4627.txt

JavaScript文件使用jQuery(清洁,但库开销):

 $.ajax({ type: 'POST', url: 'process.php', data: {json: JSON.stringify(json_data)}, dataType: 'json' }); 

PHP文件(process.php):

 directions = json_decode($_POST['json']); var_dump(directions); 

请注意,如果您在javascript中使用callback函数:

 $.ajax({ type: 'POST', url: 'process.php', data: {json: JSON.stringify(json_data)}, dataType: 'json' }) .done( function( data ) { console.log('done'); console.log(data); }) .fail( function( data ) { console.log('fail'); console.log(data); }); 

您必须在您的PHP文件中返回一个JSON对象(以javascript格式),以便在您的Javascript代码中获得“完成/成功”结果。 至less退货/打印:

 print('{}'); 

请参阅Ajax请求返回200确定但错误事件被激发,而不是成功

尽pipe对于任何更严重的事情,您都应该使用适当的响应代码明确地发回适当的头文件。

从客户端(HTML,Javascript,Vbscript ..等等)向服务器端(PHP,ASP,JSP等)发送数据有三种相关的方法:

 1. HTML form Posting Request (GET or POST). 2. AJAX (This also comes under GET and POST) 3. Cookie 

HTML表单发送请求(GET或POST)

这是最常用的方法,我们可以通过这个方法发送更多的数据

AJAX

这是asynchronous方法,这必须以安全的方式工作,在这里我们也可以发送更多的数据。

曲奇饼

这是使用less量不敏感数据的好方法。 这是使用less量数据的最佳方式。

在你的情况你可以喜欢HTML表单发布或AJAX。 但在发送到服务器之前validation您自己的JSON或使用链接像http://jsonlint.com/

如果你有Json对象使用JSON.stringify(对象)将它转换为String,如果你有JSONstring,照原样发送。

使用AJAX的HTMLinput字段(发送到服务器JSON,parsingPHP中的JSON并发送回客户端)的JavaScript的简单示例:

 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> </head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <body> <div align="center"> <label for="LName">Last Name</label> <input type="text" class="form-control" name="LName" id="LName" maxlength="15" placeholder="Last name"/> </div> <br/> <div align="center"> <label for="Age">Age</label> <input type="text" class="form-control" name="Age" id="Age" maxlength="3" placeholder="Age"/> </div> <br/> <div align="center"> <button type="submit" name="submit_show" id="submit_show" value="show" onclick="actionSend()">Show </button> </div> <div id="result"> </div> <script> var xmlhttp; function actionSend() { if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } var values = $("input").map(function () { return $(this).val(); }).get(); var myJsonString = JSON.stringify(values); xmlhttp.onreadystatechange = respond; xmlhttp.open("POST", "ajax-test.php", true); xmlhttp.send(myJsonString); } function respond() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById('result').innerHTML = xmlhttp.responseText; } } </script> </body> </html> 

PHP文件ajax-test.php:

 <?php $str_json = file_get_contents('php://input'); //($_POST doesn't work here) $response = json_decode($str_json, true); // decoding received JSON to array $lName = $response[0]; $age = $response[1]; echo ' <div align="center"> <h5> Received data: </h5> <table border="1" style="border-collapse: collapse;"> <tr> <th> First Name</th> <th> Age</th> </tr> <tr> <td> <center> '.$lName.'<center></td> <td> <center> '.$age.'</center></td> </tr> </table></div> '; ?> 

PHP有一个名为json_decode()的内置函数。 只需将JSONstring传递给此函数,它就会将其转换为PHP等价的string,数组或对象。

为了将它作为Javascript中的string传递,可以使用它将其转换为JSON

 JSON.stringify(object); 

或者Prototype等库

使用JSON.stringify(yourObj)或Object.toJSON(yourObj)最后一个是使用prototype.js,然后发送它使用任何你想要的,ajax或提交,并使用,build议,json_decode( http:// www。 php.net/manual/en/function.json-decode.php )parsing它在PHP中。 然后你可以使用它作为一个数组。

我推荐jquery.post()方法。

  <html> <script type="text/javascript"> var myJSONObject = {"bindings": 11}; alert(myJSONObject); var stringJson =JSON.stringify(myJSONObject); alert(stringJson); </script> </html> 

我find了简单的方法来做,但我知道它不完美

把json分配给

如果你是JSON的话

 var data = [ {key:1,n: "Eve"} ,{key:2,n:"Mom"} ]; 

在— main.php —-

  <form action="second.php" method="get" > <input name="data" type="text" id="data" style="display:none" > <input id="submit" type="submit" style="display:none" > </form> <script> var data = [ {key:1,n: "Eve"} ,{key:2,n:"Mom"} ]; function setInput(data){ var input = document.getElementById('data'); input.value = JSON.stringify(data); var submit =document.getElementById('submit'); //to submit and goto second page submit.click(); } //call function setInput(data); </script> 

在—— second.php —–

  <script> printJson(); function printJson(){ var data = getUrlVars()["data"]; //decode uri to normal character data = decodeURI(data); //for special character , / ? : @ & = + $ # data = decodeURIComponent(data); //remove " ' " at first and last in string before parse string to JSON data = data.slice(1,-1); data = JSON.parse(data); alert(JSON.stringify(data)); } //read get variable form url //credit http://papermashup.com/read-url-get-variables-withjavascript/ function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars; } </script>