我正在尝试制作一个Cross Origin帖子请求,并且我使用这样的普通Javascript工作:
var request = new XMLHttpRequest();
var params = "action=something";
request.open('POST', url, true);
request.onreadystatechange = function() {if (request.readyState==4) alert("It worked!");};
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");
request.send(params);
但我想使用jQuery,但我无法让它工作 . 这就是我正在尝试的:
$.ajax(url, {
type:"POST",
dataType:"json",
data:{action:"something"},
success:function(data, textStatus, jqXHR) {alert("success");},
error: function(jqXHR, textStatus, errorThrown) {alert("failure");}
});
这导致失败 . 如果有人知道为什么jQuery不起作用,请让我们都知道 . 谢谢 .
(我正在使用jQuery 1.5.1和Firefox 4.0,我的服务器正在使用正确的Access-Control-Allow-Origin标头进行响应)
3 回答
更新:正如TimK指出的那样,jquery 1.5.2不再需要这个 . 但是,如果您想添加自定义标头或允许使用凭据(用户名,密码或cookie等),请继续阅读 .
我想我找到了答案! (4小时后诅咒很多)
您需要手动指定您将接受的所有 Headers (至少在FF 4.0和Chrome 10.0.648.204中就是这种情况) .
jQuery的$ .ajax方法为所有跨域请求发送“x-requested-with”标头(我认为它是唯一的跨域) .
因此,响应OPTIONS请求所需的缺少标头是:
如果您传递任何非“简单” Headers ,则需要将它们包含在列表中(我再发送一个):
所以把它们放在一起,这是我的PHP:
另一种可能性是设置
dataType: json
会导致JQuery发送Content-Type: application/json
标头 . 这被CORS视为非标准头,并且需要CORS预检请求 . 所以要尝试一些事情:1)尝试配置服务器以发送正确的预检响应 . 这将采用其他 Headers 的形式,如
Access-Control-Allow-Methods
和Access-Control-Allow-Headers
.2)删除
dataType: json
设置 . JQuery默认情况下应该请求Content-Type: application/x-www-form-urlencoded
,但为了确保,你可以用contentType: 'application/x-www-form-urlencoded'
替换dataType: json
您正在js中发送"params":
request.send(params);
但在jquery中"data"“ . 是否定义了数据?:
data:data,
此外,您在网址中有错误:
您正在将语法与$ .post的语法混合
Update :我根据monsur回答谷歌搜索,我发现你需要添加
Access-Control-Allow-Headers: Content-Type
(以下是完整段落)http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/