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

使用标头参数的邮递员授权工作但不适用于 Axios 标头

使用 Swagger 描述 API 的标头参数

JSESSIONID 是如何传递的?作为标头参数还是作为 cookie 参数?

删除带有标头和参数的请求 Volley

如何修复 Findbugs HTTP 参数直接写入 HTTP 标头输出