【问题标题】:Jquery Ajax Does Not Send Accept HeaderJquery Ajax 不发送 Accept 标头
【发布时间】:2016-01-29 12:36:08
【问题描述】:

这是我的 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,因为接受标头实际上没有正确设置。当我使用“修改标题”谷歌浏览器扩展手动注入“接受”“应用程序/javascript;charset = 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

这里发生了什么 - 我怎样才能让它正确设置接受标头?看起来很简单……

【问题讨论】:

    标签: javascript jquery ajax jsonp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      来自jQuery,ajax API docs

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

      【讨论】:

      • 糟糕,我试图解决这个问题并从互联网上复制了一个坏例子。这是正确的内容类型,但它仍然失败......见上文
      • @Patrick 你确定你需要 JSONP,而不是 JSON。如果您向与网页位于同一域中的服务器发出请求,则应使用纯 JSON。 JSONP 是一种较旧的绕过跨域策略的方法。如果支持,今天更好的方法是使用 CORS。但是,如果服务器在同一个域中,您也不需要这样做。
      • 这里的服务器很好——我要求应用程序/json 并得到它。将其更正为 application/javascript 后,我​​仍然得到相同的结果。
      • 是的,我肯定需要 jsonp...即便如此,这不会是我需要设置的最后一个请求标头 - 很快我将需要通过标头传递凭据,我想设置那些还有……
      • 不过,根据请求,浏览器会接受任何东西。服务器应该发送响应。你从服务器得到什么响应代码?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2018-01-22
      相关资源
      最近更新 更多