[英]Why is successful jQuery cross domain post request not firing success handler?
我正在從phonegap(appgyver類固醇)應用程序發出以下JQuery跨域ajax發布請求。
function do_something(callback_method, some_vars)
{
var stringified_some_vars = JSON.stringify(some_vars);
$.ajax({
type: "POST",
url:"http://www.somedomain.com/endpoint",
data: {'some_vars' : stringified_some_vars},
async: true,
dataType: 'json',
crossDomain: true,
xhrFields: {
withCredentials: true
},
success: function(result)
{
var myObject = $.parseJSON(result);
callback_method(myObject);
},
error: function(fail)
{
supersonic.logger.debug(fail);
}
});
}
發布請求已成功發送到服務器(Google Appengine-Python)-即服務器觸發相關方法。 但是,當收到服務器響應時,jQuery Ajax方法不會觸發成功處理程序,而是觸發錯誤處理程序。 錯誤文本以以下方式打印到控制台
{"readyState":0,"responseText":"","status":0,"statusText":"error"}
來自服務器的json響應中的標頭如下:
Content-Length: 0
Cache-Control: no-cache
Access-Control-Allow-Origin: *
Content-Type: application/json
響應的內容符合預期。 並使用
text_to_send = json.dumps(python_dict)
self.response.headers.add_header('Access-Control-Allow-Origin', '*')
self.response.headers['Content-Type'] = 'application/json'
self.response.write(text_to_send)
我不清楚此錯誤來自何處。 允許跨域請求似乎並未解決該問題。 jsonp GET請求可以正常工作-但顯然,POST請求不允許使用這些請求。 誰能告訴我我要去哪里錯了?
遵循@Faisal的建議,我如下調整了服務器代碼
from urlparse import urlparse
uri = urlparse(self.request.referer)
origin = '{}://{}'.format(uri.scheme, uri.netloc)
self.response.headers.add_header('Access-Control-Allow-Origin', origin)
self.response.headers['Content-Type'] = 'application/json'
標頭現在
Content-Length: 0
Cache-Control: no-cache
Access-Control-Allow-Origin: http://localhost
Content-Type: application/json
但是遇到相同的錯誤
我認為,如果使用withCredentials:是的,則需要您的來源是完全匹配的,而不是通配符(*)。 這是一個從引薦來源獲取代碼的快速代碼。 但您可能還應該檢查其是否為允許的來源之一:
from urlparse import urlparse
uri = urlparse(self.request.referer)
origin = '{}://{}'.format(uri.scheme, uri.netloc)
編輯
嘗試添加:
self.response.headers.add_header('Access-Control-Allow-Credentials', 'true')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.