jQuery - Ajax 在 GET 中提交 JSON 数据


jQuery - Ajax submit JSON data in GET

这是我尝试过的:

.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。我不知道为什么,因为内容类型设置为应用程序/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链接(空输出仍然存在,换句话说仍然不起作用(。我应该在上面说明的问题是,通过 jQuery 发布时,php://input实际上是空的,根本没有数据 - 与 curl GET 结合使用时没有问题。


编辑2:我没有使用IIS,谢谢robertdeniro(呵呵(指出它。

我的怀疑是准确的,问题的原因是 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') );

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

尝试:

header('Content-type: application/json'(;

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

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

它应该是

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

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

使用 $.

get & $.post 而不是 $.ajax,生活会容易得多。喜欢这个:

$.get(request_url, { param: value }, function(data){
  // callback here
}, 'json')

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