Vis*_*ish 7 javascript php ajax jquery json
我试图将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);
});
Run Code Online (Sandbox Code Playgroud)
PHP文件
<?php
$obj = $_POST['data'];
// print_r($obj);
return $obj;
?>
Run Code Online (Sandbox Code Playgroud)
Phi*_*hil 11
标准jQuery .ajax()方法使用该data属性创建一个x-www-form-urlencoded字符串以传递请求正文.像这样的东西
action=Flickr&get=getPublicPhotos
Run Code Online (Sandbox Code Playgroud)
因此,你的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'
})
Run Code Online (Sandbox Code Playgroud)
然后,您的PHP脚本将从php://input流中读取数据有效负载,例如
$json = file_get_contents('php://input');
Run Code Online (Sandbox Code Playgroud)
然后,您可以将其解析为PHP对象或数组...
$dataObject = json_decode($json);
$dataArray = json_decode($json, true);
Run Code Online (Sandbox Code Playgroud)
并且,如果您只是想将它回馈给客户端..
header('Content-type: application/json');
// unmodified
echo $json;
// or if you've made changes to say $dataArray
echo json_encode($dataArray);
Run Code Online (Sandbox Code Playgroud)
由于OP标题的说法,Phil的优秀答案
从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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们还需要服务器的响应转换成JavaScript 对象使用JSON.parse()
现在,在服务器端(基于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;
Run Code Online (Sandbox Code Playgroud)
注意:
首先解码然后编码回原始json输入的原因是正确地逃避数据中(可能的)URL中的斜杠,例如
json_encode 将转换此URL
http://example.com
Run Code Online (Sandbox Code Playgroud)
成
http:\/\/example.com
Run Code Online (Sandbox Code Playgroud)
......在OP中不是这种情况,但在其他一些场景中很有用.