我正在从phonegap(appgyver steroids)应用程序发出以下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
但遇到同样的错误
答案 0 :(得分:1)
我认为如果它是withCredentials:true你需要你的原点是完全匹配而不是通配符(*)。这是从referer获取它的快速代码。但你应该检查它是否是允许的起源之一:
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')