Jquery Ajax不发送接受标头

时间:2016-01-29 03:58:35

标签: javascript jquery ajax jsonp

这是我的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

这里发生了什么 - 如何才能正确设置接受标头?看起来很简单......

2 个答案:

答案 0 :(得分:1)

问题在于我期待错误的事情。根据这个jquery错误报告(https://bugs.jquery.com/ticket/7694),当你执行JSONP时,你实际上没有触发XHR,所以你无法控制标题。

答案 1 :(得分:0)

当您请求JSONP时,您要求发回一个脚本来执行您提供的回调。脚本的正确Accepts标头为application/javascript而非application\json。在我看来,你的服务器是错误的,而不是jQuery。也就是说,您可以尝试将AJAX设置中的accepts属性设置为application/json,看看是否有效。我认为这不应该是必要的,即使它有效,我也不会推荐它;我建议你尽可能修理服务器。

来自jQuery,ajax API docs

  

如果指定了jsonp,$ .ajax()会自动追加查询字符串参数(默认情况下)callback =?到URL。传递给$ .ajax()的设置的jsonp和jsonpCallback属性可用于分别指定查询字符串参数的名称和JSONP回调函数的名称。服务器应该返回将JSON响应传递给回调函数的有效JavaScript。在将响应中包含的JSON对象传递给$ .ajax()成功处理程序之前,$ .ajax()将执行返回的JavaScript,调用JSONP回调函数。