Ajax POST请求变成了GET请求

4

我正在尝试使用Redis,并希望构建一个简单的前端/后端设置来测试和练习。前端是HTML / Javascript / JQuery,后端是PHP / Apache / Redis。基本上,我希望向后端发送一个POST请求并接收响应,然后在Web控制台上显示它。为了发送请求,我使用了JQuery:

var data = $("#login_form :input").serializeArray();

var username = data[0]['value'];
var password = data[1]['value'];

$.ajax({
        type: "POST",
        url: "http://localhost/Convo/user.php?jsoncallback=%3F",
        dataType: "json",
        cache: false,
        data: { username: username, password: password, method: "create" },
        success: function(text){console.log("awesome");}
        });

我正在使用Firefox上的Firebug来查看实际情况。在Firebug中,我看到发送了一个GET请求而不是POST请求。附加在URL上的jsoncallback字符串可能是原因,但如果没有它,我就根本没有得到响应。顺便说一下,我期望得到JSON格式的响应。以下是我的PHP代码:

    error_reporting(E_ALL);
ini_set('display_errors', '1');
require 'Predis/Autoloader.php';
Predis\Autoloader::register();

$body = array();
$head = array();

$redis = new Predis\Client(array(
        'scheme' => 'tcp',
        'host'   => '127.0.1.1',
        'port'   => 6379,
));

if(!$redis)
{
    $body['status'] = "fail";
    $body['message'] = "unable to connect to database";
    $head['body'] = $body;

    header('Content-type: application/json');
    echo json_encode($head);
    exit;
}
else
{
    $body['status'] = "success";
    $body['message'] = "connected to database!";
    $head['body'] = $body;
    $jsoncallback = $_POST['jsoncallback'];

    header('Content-Type: application/json');
    echo $jsoncallback . '(' . json_encode($head) . ')';
    exit;
}

jsoncallback是获取响应的唯一方法,但我如何成功地发起一个真正的POST请求而不使用它?


你为什么要设置那个获取参数呢?在你的脚本中似乎并不需要它。 - Francisco Presencia
无法使用jsonp数据类型进行POST。 - Kevin B
根据我在另一个问题中找到的答案,从PHP返回的数据必须由通过get发送的jsoncallback“包装”。如果没有所有的jsoncallback内容,请求会被触发但不会返回任何东西。 - Gregory-Turtle
我在我的帖子中使用“文本”作为数据类型,但你可能想要使用JSON而不是JSONP。 - Baked Inhalf
我已将其更改为JSON格式,但它仍然变成了GET请求。 - Gregory-Turtle
2个回答

5

可能是因为您使用了dataType为jsonp,jsonp不支持POST请求。

编辑:尝试在其他参数中发送您的jsoncallback参数:

$.ajax({
        type: "POST",
        url: "http://localhost/Convo/user.php",
        dataType: "json",
        cache: false,
        data: { username: username, password: password, method: "create", jsoncallback: "%3F" },
        success: function(text){console.log("awesome");}
        });

我将dataType改为“JSON”,并删除了jsoncallback的内容。尽管post已被触发,但没有返回任何东西。我甚至在php脚本中写入文件以确保其被执行,结果文件也写入成功。 - Gregory-Turtle
你正在将“?”作为参数jsoncallback发送吗?如果是这样,请尝试使用%3F代替“?”。 - Vinicius Souza
就像jsoncallback=%3F一样,因为我刚刚尝试了它,仍然没有响应。 - Gregory-Turtle
尝试将 $jsoncallback = $_GET['jsoncallback']; 更改为 $jsoncallback = $_POST['jsoncallback']; 或将 ajax 类型更改为 "GET"。 - Vinicius Souza
是的,我仍然将jsoncallback作为参数发送,并将其设置为%3F。数据类型为json。 - Gregory-Turtle
显示剩余2条评论

0

看起来将这行代码添加到我的php文件中解决了问题:

header('Access-Control-Allow-Origin: *');

我知道这不是最佳实践,但我已经无计可施了。这是一个跨站点禁止,阻止响应返回到我的前端。我也知道有一种方法可以过滤掉只允许特定站点发出请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接