这是我的ajax电话:
function fetchAccount(email, callback) {
$.ajax({
url: "http://example.com/",
jsonp: "callback",
dataType: 'jsonp',
type: 'GET',
async: false,
headers: {"Accept" : "application/javascript; charset=utf-8"},
success: function(data) {
appState.user = data;
appState.viewState = AppStates.CONTENT_VIEW;
AppStore.persistToLocalStorage();
callback();
},
error: function(xhr, status, err) {
appState.user = "";
appState.viewState = AppStates.LOGIN_FAIL_VIEW;
AppStore.persistToLocalStorage();
callback();
}
});
};
我的服务器没有返回JSONP,因为接受标头实际上没有正确设置。当我使用"修改标题"谷歌Chrome扩展程序手动注入"接受" "应用程序/ JavaScript的;字符集= UTF-8"服务器响应JSONP就好了。
我按照预期捕获了请求标题,"接受"没有正确设置:
GET /api/accounts/myemail@gmail.com?callback=jQuery22009572079558856785_1454040030107&_=1454040030108 HTTP/1.1
Host: www.example.com
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,et;q=0.6
这里发生了什么 - 如何才能正确设置接受标头?看起来很简单......
答案 0 :(得分:1)
问题在于我期待错误的事情。根据这个jquery错误报告(https://bugs.jquery.com/ticket/7694),当你执行JSONP时,你实际上没有触发XHR,所以你无法控制标题。
答案 1 :(得分:0)
当您请求JSONP
时,您要求发回一个脚本来执行您提供的回调。脚本的正确Accepts标头为application/javascript
而非application\json
。在我看来,你的服务器是错误的,而不是jQuery。也就是说,您可以尝试将AJAX设置中的accepts
属性设置为application/json
,看看是否有效。我认为这不应该是必要的,即使它有效,我也不会推荐它;我建议你尽可能修理服务器。
如果指定了jsonp,$ .ajax()会自动追加查询字符串参数(默认情况下)callback =?到URL。传递给$ .ajax()的设置的jsonp和jsonpCallback属性可用于分别指定查询字符串参数的名称和JSONP回调函数的名称。服务器应该返回将JSON响应传递给回调函数的有效JavaScript。在将响应中包含的JSON对象传递给$ .ajax()成功处理程序之前,$ .ajax()将执行返回的JavaScript,调用JSONP回调函数。