我正在通过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
200
application/json
供参考,我的答复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()...处理程序,它将起作用。
complete: function()...
因此,问题是:正在发生(或没有发生),为什么?我得到的数据很好,我只想能够返回响应。
更新 : 这解决了我在一些浏览器上的问题,但是由于我对这种行为没有完整的明确的解释,所以我将它保持开放 。
好的,所以我阅读了手册,并且据我所知,所应用的算法大致如下:
POST
我目前尚不了解,并且从手册中(至少对我而言)不清楚,CORS请求是否还应在请求中使用这些标头以及OPTIONS。我将试验Max- Age标题,看看允许或不允许的内容。但是,我仍然对此问题缺乏明确的权威性理解,因此,如果有人在这里知道,我会很高兴。
Max- Age
好的,所以我相信正确的做法是这样的:
if request.method == "POST": response = HttpResponse(simplejson.dumps(data),mimetype='application/json') response['Access-Control-Allow-Origin'] = "*" return response elif request.method == "OPTIONS": response = HttpResponse("") response['Access-Control-Allow-Origin'] = "*" response['Access-Control-Allow-Methods'] = "POST, OPTIONS" response['Access-Control-Allow-Headers'] = "X-Requested-With" response['Access-Control-Max-Age'] = "1800" else: return HttpResponseBadRequest()
这是基于我根据预检请求从Mozilla挖掘而来的文档。
所以,我相信会发生的是:
X-Requested-With
XMLHttpRequest
Origin
Allow-Methods
Allow-Headers
Allow-Origin
我认为这是对正在发生的事情的正确总结,无论如何它似乎都起作用。如果我不对,请大喊。