jQuery Ajax访问自定义响应头

10

我正在使用一些API,然后发现在响应中有这个:

Chrome控制台屏幕

我需要读取"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"
});

有谁知道为什么吗?? :(

谢谢


1
谢谢编辑Rory :) 我忘了按Ctrl+K :D - Sampgun
这个答案似乎很好地解释了问题。 - mnewelski
2个回答

19

问题是由于请求使用了CORS。因此,您需要明确允许将自定义标头暴露给接收者。要执行此操作,请将Access-Control-Expose-Headers头添加到响应中,例如:

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

请注意,这必须在创建响应的服务器上完成。如果您无法控制服务器,则无法进行此更改。您需要向API提供者请求更改。


实际上这个API不是我的,所以我不能编辑它们。但是为什么我能在浏览器中看到它们,如果我无法访问它们呢? - Sampgun
那如果我用 PHP curl 呢? - Sampgun
1
我已经添加了一条关于此事的注释;你需要请求API提供者添加头部 - 尽管他们启用了CORS,但没有添加头部来公开自定义头部似乎有些奇怪。可能只是疏忽。浏览器可以看到所有内容。由于同源策略,JS在这种情况下无法访问。 - Rory McCrossan
如果您通过PHP使用cURL获取它,则CORS不会成为问题,因此它将正常工作。 - Rory McCrossan
1
在浏览器中看到的内容与xhr可以检索到的内容不同。cURL应该检索所有标头,因此可能是最佳选项。 - mnewelski
太好了。谢谢大家! - Sampgun

5
您的访问限定符未被提及,因此它会被存储在某个未知的位置。现在您需要先初始化它。
为了更好地进行初始化:
 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"

});

我会尽快尝试这个。 - Sampgun
你只需要在函数外部声明并获取左侧的值。 - Asim Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接