将json对象从javascript发送到php

我正在尝试将JSON对象从Javascript / Jquery发送到PHP,我在控制台中收到错误信息。 我究竟做错了什么。 我是JS和PHP的新手。

JQuery文件:

$(document).ready(function() { var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'}; // console.log(typeof(flickr)); var makeFlickrCall = function(flickrObj){ $.ajax({ url: '../phpincl/apiConnect.php', type: 'POST', data: flickrObj }) .done(function(data) { console.log("success"); console.log(JSON.stringify(data)); }) .fail(function() { console.log("error"); }) .always(function() { console.log("complete"); }); }; makeFlickrCall(flickr); }); 

PHP文件

  

不过,菲尔的优秀答案,不过,因为OP标题说

从javascript( 不是jQuery )发送json对象到php

这是如何使用(香草)javascript,以防它有助于寻找这种方法的人:

 var jsondata; var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'}; var data = JSON.stringify(flickr); var xhr = new XMLHttpRequest(); xhr.open("POST", "../phpincl/apiConnect.php", !0); xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xhr.send(data); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { // in case we reply back from server jsondata = JSON.parse(xhr.responseText); console.log(jsondata); } } 

请注意,我们仍然需要使用JSON.parse()将服务器的响应转换为javascript 对象

现在,在服务器端(基于Phil的回答)如果您要向客户端发送回复,您可以:

 header('Content-type: application/json'); $json = file_get_contents('php://input'); $json_decode = json_decode($json, true); $json_encode = json_encode($json_decode); echo $json_encode; 

注意

首先解码然后编码回原始json输入的原因是正确地逃避数据中(可能的)URL中的斜杠,例如

json_encode将转换此URL

 http://example.com 

 http:\/\/example.com 

……在OP中并非如此,但在其他一些场景中很有用。

标准的jQuery .ajax()方法使用data属性创建一个x-www-form-urlencoded字符串以传递请求体。 像这样的东西

 action=Flickr&get=getPublicPhotos 

因此,您的PHP脚本不应该查找$_POST['data'] ,而应该查找$_POST['action']$_POST['get']

如果要将原始JSON数据有效负载发送到PHP,请执行以下操作…

将AJAX contentType参数设置为application/json ,并将JSON对象的字符串化版本作为data有效负载发送,例如

 $.ajax({ url: '../phpincl/apiConnect.php', type: 'POST', contentType: 'application/json', data: JSON.stringify(flickrObj), dataType: 'json' }) 

然后,您的PHP脚本将从php://input流中读取数据有效负载,例如

 $json = file_get_contents('php://input'); 

然后,您可以将其解析为PHP对象或数组…

 $dataObject = json_decode($json); $dataArray = json_decode($json, true); 

并且,如果您只是想将它回馈给客户端..

 header('Content-type: application/json'); // unmodified echo $json; // or if you've made changes to say $dataArray echo json_encode($dataArray); 

使用:

 makeFlickrCall( { data: JSON.stringify( flickr )} ); 

代替

 makeFlickrCall(flickr); 

您的服务器端脚本应该收到您的JSON,如下所示:

 data="{"action":"Flickr","get":"getPublicPhotos"}"