0

这是我尝试过的:

JS:

$.ajax({
    type: 'GET',
    contentType: 'application/json; charset=UTF-8',
    data: JSON.stringify( { data: 'bla' } ),
    dataType: 'json',
    success: function( data ) {
        alert(data);
    },
    error: function( data ) {
        alert('error: ' + data);
    }
});

PHP:

<?php

    if ( $_SERVER['REQUEST_METHOD'] == 'GET' )
    {
        $data = json_decode( file_get_contents('php://input') );

        echo json_encode( $data );
    }

?>

输出:

null

如果您将GETPOST交换,它就像一个魅力。“为什么不直接使用 POST?”,我使用 POST 来执行插入数据库的操作。我有一种预感,这可能是因为它强烈希望 GET 数据采用这种格式:email=bob@mctest.com&firstname=Bob&lastname=Mctest. 我不知道为什么,因为内容类型设置为application/json,这有点令人困惑。只是从我上次编辑中添加一些内容,它php://input是空的,换句话说它没有向它发送任何数据,但它仍然可以正常工作,使用来自终端的 curl GET 。

当我使用 JSON 内容类型从终端运行 curl GET 命令时,它就像一个魅力,并且吐出数据没有问题,即curl -v -X GET -H "Content-Type: application/json" -d '{"data":"bla"}' http://codes.local/test.php

我不确定这会有多大帮助,但我找到了一个 PHP Fiddle 站点并将示例代码粘贴在那里只是为了让每个人都更容易,这里是链接: http: //phpfiddle.org/main/code/u4b -xkh

非常感谢您的帮助。


编辑:修复了 SilverBlade 指出的 'application/json' 中的拼写错误并更新了 PHP Fiddle 链接(空输出仍然存在,换句话说仍然无法正常工作)。我应该在上面说明的问题php://input是实际上是空的,通过 jQuery 发布时根本没有数据 - 与 curl GET 结合使用时没有问题。


Edit2:我没有使用 IIS,感谢 robertdeniro (heh) 指出这一点。

4

5 回答 5

2

我的怀疑是准确的,问题的原因是 jQuery $.ajax/$.get 在使用 GET 时强制查询字符串,即使您已将内容类型设置为 JSON,这没有任何意义,但我将不得不剖析手册以找出原因。

这是我的工作代码,其中包含与 curl GET 和 $.ajax/$.get 一起使用的解决方法。

JS:

$.ajax({
    type: 'GET',
    url: 'manage.php',
    data: 'user=bla',
    dataType: 'json',
    success: function( data ) {
        // code here...
    }
});

PHP:

$get = !empty( $_GET ) ? json_decode( json_encode( $_GET ) ) : json_decode( file_get_contents('php://input') );
于 2013-09-28T01:24:26.517 回答
1

SilverBlade 可能发现了您的问题,但 XHR 和 PHP 之间仍然存在通信问题。PHP 需要返回正确的标头,否则 jQuery 解释可能会发生奇怪的事情。

尝试:

header('内容类型:应用程序/json');

于 2013-09-27T02:42:19.373 回答
1

您的内容类型有拼写错误,

contentType: 'appllication/json; charset=UTF-8',

它应该是

contentType: 'application/json; charset=UTF-8',

其次,您可以检查指定 URL。

于 2013-09-27T01:58:19.577 回答
0

使用 $.get & $.post 而不是 $.ajax,生活会容易得多。像这样:

$.get(request_url, { param: value }, function(data){
  // callback here
}, 'json')
于 2013-09-27T02:35:09.540 回答
0

我不明白您的意思是您不能使用 POST,因为您正在使用 POST 进行数据库插入。
POST用于向服务器发送数据,这可能是服务器忽略 GET 中数据的原因——因为它不需要在 GET 中处理数据。
如果您已经在使用 POST,那么您可以扩展它 - 就像您的 json 可以有 2 个属性 - 操作和数据。
Action = [dbInsert, dbSomethingElse, fileWrite, etc]
Data 将是原始数据。
您将根据操作采取不同的代码路径
我不知道您使用的是什么 Web 服务器,但 IIS 会忽略 GET 中的数据 - 无论 'application/json; charset=UTF-8'、'application/x-www-form-urlencoded' 等。

于 2013-09-27T12:05:20.027 回答