【问题标题】:POST data to PHP via AJAX not working通过 AJAX 将数据发布到 PHP 不起作用
【发布时间】:2014-10-26 16:45:51
【问题描述】:

我正在通过 ajax 向我的服务器 (PHP) 发送数据,我将调用设置为 POST 请求,但不知何故它不能以这种方式工作,而是作为 GET 请求工作,代码如下:

$.ajax({
 type: 'POST',
 data: {
     user: user
 },
 url: url,
 crossDomain: true,
 contentType: "application/json; charset=utf-8",
 dataType: 'jsonp',
 success: function (data) {
     alert(data);
 },
 error: function (error) {
     alert(error)
 }
});

PHP:

<?php
$user = $_POST["user"];
echo $user;
?>

这不起作用,但如果我将 $_POST 更改为 $_GET,它会很好用。

当我在 ajax 调用中设置它时,服务器解释 GET 而不是 POST,我做错了什么?

【问题讨论】:

    标签: php ajax post get


    【解决方案1】:

    你有几个问题。

    这一行:

    dataType: 'jsonp',
    

    ... 使您的请求发出 JSONP 请求。通过向文档添加&lt;script&gt; 元素来发送数据,并且响应必须编码为 JSONP。您的响应未编码为 JSONP,它是纯文本响应。

    删除该行。

    请注意,由于您使用的是 PHP,因此默认情况下响应的内容类型为 text/html。由于您直接从脚本中回显用户输入,因此您很容易受到XSS attack 的攻击。将您的输出编码为 HTML(使用htmlspecialchars)或声明您正在发送纯文本:

    header("Content-Type: text/plain");
    

    这一行:

    contentType : "application/json; charset=utf-8",
    

    ...使您的 HTTP 请求声称您正在发送 JSON,但是:

    1. 你不是,你正在发送application/x-www-form-urlencoded数据
    2. PHP 不会自动解码 JSON 格式的请求(因此不会填充 $_POST

    删除该行。您将使用正确的内容类型(因为默认值是正确的),PHP 将填充 $_POST(因为它会自动为 application/x-www-form-urlencoded 数据执行此操作)。

    (当您使用 GET 请求时它可以工作,因为数据被编码在查询字符串中,并且内容类型标头被忽略,因为没有描述类型的内容)。

    【讨论】:

    • 或者,将有效负载编码为 json,这显然是有意义的。
    • @arkascha — 鉴于问题中的 PHP 不解码 JSON,这没有任何意义。
    • 显然你必须匹配两边,你是对的。认为这很明显,我的错。
    • 虽然仍然不是一个好主意。您必须编写更多代码来对其进行编码,并编写更多代码来对其进行解码,这只是出现问题的更多机会。
    • 但它使您不必手动处理编码,这最终需要更多的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多