通过AJAX将数据POST到PHP无法正常工作

时间:2014-10-26 16:45:52

标签: php ajax post get

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

$.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,则效果很好。

我做错了什么,服务器根据我的意愿解释GET而不是POST,因为我在ajax调用中设置它?

1 个答案:

答案 0 :(得分:1)

你有几个问题。

这一行:

dataType: 'jsonp',

...导致您的请求发出JSONP请求。通过向文档添加<script>元素来发送数据,并且响应必须编码为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
  3. 删除该行。您将使用正确的内容类型(因为默认值是正确的),PHP将填充$_POST(因为它会自动为application/x-www-form-urlencoded数据执行此操作)。

    (当你使用GET请求时它会起作用,因为数据在查询字符串中被编码,而内容类型标题被忽略,因为没有内容来描述类型)。