【问题标题】:send json object from javascript to php将 json 对象从 javascript 发送到 php
【发布时间】:2014-07-08 04:12:59
【问题描述】:

我正在尝试将 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;
?>

【问题讨论】:

  • console.log 错误 .fail 和 .always msg 显示在我的控制台窗口中。
  • 试试print_r($_POST)看看结果。
  • 这表明你想把变量flickrObj作为数据发送,你需要把它设为一个全局变量,里面是什么?
  • 这是我的变量 flickr = {'action': 'Flickr', 'get':'getPublicPhotos'};
  • 您必须使用$_POST['action'] 获取action 的值,使用$_POST['get'] 获取get 的值。如果您只想返回echo json_encode($_POST);

标签: javascript php jquery ajax json


【解决方案1】:

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

action=Flickr&get=getPublicPhotos

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

如果您想向 PHP 发送原始 JSON 数据负载,请执行以下操作...

将 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);

【讨论】:

  • 我需要做什么才能使帖子工作 $_POST['data'] 并将对象返回给 javascript?
  • @Phil 非常有帮助的答案,我可以让 php 将当前发生的事情的执行进度 几次 发回吗?因为我的 php 执行时间太长了。
【解决方案2】:

菲尔的回答很好,但是因为 OP 标题说

将 json 对象从 javascript(不是 jQuery)发送到 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 将转换此网址

http://example.com

进入

http:\/\/example.com

...这在 OP 中不是这种情况,但在其他一些场景中很有用。

【讨论】:

  • 感谢 JFK 的回复,我的标题确实是 Javascript,但我在描述中指定了 Javascript/Jquery。
  • @Vish :没问题,我只是提供了一种使用 javascript 的方法,以防万一有人不想包含 jQuery
  • 感谢您的努力,我很高兴知道解决问题的两种方法:)
【解决方案3】:

用途:

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

代替

makeFlickrCall(flickr);

您的服务器端脚本应按如下方式接收您的 JSON:

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

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多