【发布时间】:2011-07-12 05:20:22
【问题描述】:
我正在通过 POST 请求跨域发送数据,但响应不起作用,具体来说,jQuery 的成功处理程序永远不会被调用。
使用的东西:Django、Apache、jQuery。
所以,我设置了一个与此类似的请求:
$.ajax({
url: "http://somesite.com/someplace",
type: "POST",
cache: false,
dataType: "json",
data: { ... },
success: function( msg ) {
alert(msg);
},
});
如您所知,CORS 允许我适当地回复OPTIONS 查询以说“是的,您可以发帖给我”。我正在做的。 Firebug 确认我收到了我的200 状态码,并且返回类型实际上是application/json。但是,Firebug 也确认上面的成功处理程序没有被调用。
作为参考,我对OPTIONS的回复是:
elif request.method == "OPTIONS":
response = HttpResponse("")
response['Access-Control-Allow-Origin'] = "*"
response['Access-Control-Allow-Methods'] = "POST, GET, OPTIONS"
response['Access-Control-Allow-Headers'] = "X-Requested-With"
return response
相比之下,如果我设置了一个complete: function()... 处理程序,它就可以工作。
所以,问题是:发生了什么(或没有发生),为什么?我得到的数据很好,我只想能够返回响应。
更新:这解决了我在某些浏览器上的问题,但由于我对此行为没有完整的明确解释,所以我将其保持打开状态。
好的,所以我读了the manual,据我了解,应用的算法大致是这样的:
- 用户代理可以实现预检调用。这是
OPTIONS请求。这个想法是他们提出这个请求,这给他们一个关于所请求资源的答案,然后他们应该缓存这些资源。 我没有传回 max-age 字段,所以我怀疑在返回成功并且允许 X 请求时,用户代理的缓存中没有任何内容允许我这样做,所以应用默认规则(隔离请求)。 - 当您发出实际请求时,我相信用户代理应该检查飞行前缓存的权限。如果没有我的 max-age 字段,我相信它找不到这些权限。但是,在
POST上使用相同的标题进行响应似乎允许 Firefox 和 Google Chrome 查看响应。歌剧不能。 IE 目前尚未经过测试。
我目前不明白,从手册中也不清楚(至少对我而言)CORS 请求是否也应该在请求中使用这些标头以及OPTIONS 来回答。我将试验Max-Age 标头,看看允许或不允许什么。但是,我对这个问题仍然缺乏一定的权威理解,所以如果这里有人知道,我会全力以赴。
【问题讨论】:
-
可能由于是跨域调用而受到限制。我不想登录 mybank.com 并将我的信息发送到 somebank.com(同样的前提适用于此处,无论有效负载多么微不足道)。
-
信息已发送。 CORS 实现了这一点。因此,任何应该受到保护的信息都刚刚发布到一个完全独立的域,现在位于我的 Postgres 服务器中。太晚了。这里的问题不是发送信息,而是接收信息。
-
浏览器不支持这个。数据已收到,但浏览器不让你看到。您可以使用“fiddler”进行测试
-
@Ninefingers:我以发送为例,但问题仍然与跨域相关。如果我太含糊,我很抱歉。
-
不确定,但可能是您需要使用 jsonp 而不是 json。 codeproject.com/KB/aspnet/JSONToJSONP.aspx
标签: javascript jquery ajax cross-domain cors