繁体   English   中英

将json对象从javascript发送到php

[英]send json object from javascript to 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文件

<?php       
    $obj = $_POST['data'];
    // print_r($obj);
    return $obj;
?>

标准的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);

由于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);
    }
}

请注意,我们仍然需要使用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中不是这种情况,但在其他一些场景中很有用。

采用:

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

代替

makeFlickrCall(flickr);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM