jQuery Ajax 访问自定义响应标头

Posted

技术标签:

【中文标题】jQuery Ajax 访问自定义响应标头【英文标题】:jQuery Ajax access custom response headers 【发布时间】:2018-02-17 04:54:38 【问题描述】:

我正在使用一些 API,我注意到在响应中我有这个:

我需要阅读“x-dl-units-left”,但我得到了 null:

$.ajax(ajaxConfig).done(function(response, textStatus, xhr)
  var left = xhr.getResponseHeader("x-dl-units-left"); //null
  var all = xhr.getAllResponseHeaders(); // "content-type: application/json;charset=UTF-8"
);

谁知道为什么? :(

谢谢

【问题讨论】:

谢谢 4 编辑 Rory :) 我忘了按 Ctrl+K :D This answer 似乎很好地解释了这个问题。 【参考方案1】:

问题是因为请求使用了 CORS。因此,您需要明确允许您的自定义标头向收件人公开。为此,请在响应中添加 Access-Control-Expose-Headers 标头,例如:

Access-Control-Expose-Headers: x-dl-units-left, x-dl-units, [other headers as needed...]

请注意,这必须在创建响应的服务器上完成。如果您无法控制服务器,那么您将无法进行此更改。您需要从 API 提供商处请求它。

【讨论】:

其实API不是我的,所以我不能编辑那些..但是我不能访问为什么我可以在浏览器中看到它们?? 如果我用 php curl 得到这个? 我添加了一个注释;您需要请求 API 提供程序添加标头 - 尽管很奇怪他们启用了 CORS 而不添加标头来公开自定义标头。大概只是疏忽。允许浏览器查看所有内容。由于同源策略,JS 在这种情况下不能 如果您通过 PHP 使用 cURL 获取它,那么它可以正常工作,因为 CORS 不会成为问题。 在浏览器中看到它们与 xhr 可以检索到的不同。 cURL 应该检索所有标头,因此这可能是最佳选择。【参考方案2】:

没有提及您的访问说明符,因此它确实存储但在一些未知的地方。现在你需要先初始化它。 为了更好的初始化:

回应

 Acccess-Control-Expose-Headers: x-dl-units-left;

在客户端

 $.ajax(ajaxConfig).done(function(response, textStatus, xhr)

  var all = xhr.getAllResponseHeaders(); 
 // "content-type: application/json;charset=UTF-8"

);

【讨论】:

我会尽快试试这个 您只需要在函数之外声明并获取 left 的值。

以上是关于jQuery Ajax 访问自定义响应标头的主要内容,如果未能解决你的问题,请参考以下文章

jquery $.ajax 自定义 http 标头问题

JQuery、CORS 和自定义响应标头

Spring MVC过滤器获取自定义jquery ajax标头

如何使用js或jQuery向ajax请求添加自定义HTTP标头?

带有自定义标头的跨域 jquery ajax api 调用未命中服务器

如何使用 Jquery Ajax 发送自定义标头并使用 C# 在 WCF 服务中检索相同的标头值?