transformResponse 标头参数 ($resource) 中缺少自定义响应的标头
Posted
技术标签:
【中文标题】transformResponse 标头参数 ($resource) 中缺少自定义响应的标头【英文标题】:Custom response's headers are missing from transformResponse headers argument ($resource) 【发布时间】:2016-01-20 07:59:00 【问题描述】:我已经为 API 端点定义了一个 $resource
,该端点返回一个包含多个 headers
的响应,但在 transformResponse
配置函数中,headersGetter
函数参数中缺少大多数标头。
我该如何解决?
API 的响应标头
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
x-frame-options: DENY
Access-Control-Allow-Origin: http://localhost:9000
access-control-allow-methods: POST, PUT, GET, DELETE, OPTIONS
access-control-allow-headers: Content-Type
Access-Control-Allow-Credentials: true
Content-Disposition: attachment; filename="testCall.pcap"
FileName: testCall.pcap
Content-Type: application/pcap
transformResponse
的标头
Pragma: no-cache
Content-Type: application/pcap
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: 0
app.factory("MyService", function ($resource, ENV, _)
return
testCall: $resource(ENV.apiEndpoint + "/test-call", ,
launch:
method: 'POST',
isArray: false,
headers:'Accept':'application/octet-stream',
responseType: 'blob',
cache: false,
transformResponse: function(data, headers)
var filename = headers('Content-Disposition'); //headers('FileName')
var contentType = headers('Content-Type');
var file = new Blob([data],
type: contentType
);
var fileURL = URL.createObjectURL(file);
var a = document.createElement('a');
a.href = fileURL;
a.target = '_blank';
a.download = filename;
document.body.appendChild(a);
a.click();
),
searchOptions: $resource(ENV.apiEndpoint + "//search-options")
;
);
【问题讨论】:
【参考方案1】:假设您正在进行 CORS 调用,响应标头并未全部公开。服务器端需要在 CORS 过滤器中添加响应头“Access-Control-Expose-Headers”。
例如要使用 CORS 调用读取名为“X-MY-HEADER1”和“X-MY-HEADER2”的自定义响应标头,服务器添加标头
Access-Control-Expose-Headers: "X-MY-HEADER1, X-MY-HEADER2"
在https://***.com/a/23726352/4684232@nancoder 上查看答案
【讨论】:
感谢您的回复。是的,这是对子域的 CORS 调用,但上面的响应标头是 Angular 服务器接收到的(我已经使用 Firebug 获得了它们)。所以对我来说,我认为 Angular 框架会在transformResponse
... 之前清理其中的一些
+1 伙计,我很想知道确切的答案,但在跨域 RESTFull Api 和从标头位置获取 ID,通过在服务器上添加标头就可以了!谢谢你的好答案。
最后,我能够获得我的自定义令牌。谢谢乔和阿德里亚诺。以上是关于transformResponse 标头参数 ($resource) 中缺少自定义响应的标头的主要内容,如果未能解决你的问题,请参考以下文章
javascript Axios示例,带有transformResponse.js