Restangular:如何获取HTTP响应头?

4

我有一个REST服务器,它返回一个HTTP头部Link,用于响应PUT请求并指示新创建实体的URL:

Link:<entities/6>; rel="created"

有没有可能用Restangular读取链接头信息?

到目前为止,我遇到的唯一使用Restangular拦截HTTP请求的方法是在应用程序配置中注册响应拦截器:

restangular.addResponseInterceptor(function (data, operation, what, url, response, deferred) {
    console.log(response.headers())
    return response.data;
});

然而,尽管已经实现了上述演示,但唯一被记录的HTTP标头是content-type。仍然可以在浏览器开发工具栏中看到响应确实带有许多其他HTTP响应标头,例如ServerDate和前面提到的Link
为什么我不能通过addResponseInterceptor()访问完整的HTTP响应标头数组?是否有任何方法可以使用Restangular捕获所需的HTTP响应标头?
注意:我不寻求使用HAL或任何其他特殊的响应体格式来获取答案。我更想知道是否可以使用Restangular使用纯HTTP标头(如果不能,我可能会转向HAL或其他东西)。

你好!这个答案有帮助解决问题吗?请记住,STEVER建议的编辑很重要。 - troig
1个回答

11

您不需要使用ResponseInterceptor来完成这个任务。只需将fullResponse设置为true,每次发出请求时都会获取整个响应(包括HTTP标头)。

Restangular.setFullResponse(true);

您可以在应用程序配置中全局设置它。例如:

angular.module('YourApp')
     .config(['RestangularProvider',
       function (RestangularProvider) {
         RestangularProvider.setFullResponse(true);
...

然后,每次收到响应时,您都可以访问所有响应头。

Restangular.all('users').getList().then(function(response) {
    $scope.users = response.data;
    console.log(response.headers);
}

示例:

response.headers('Link')

注意:使用fullResponse时,响应数据位于response.data中,而不是直接位于response中。

编辑:如@STEVER所指出的那样,您还需要在服务器API中公开头信息

示例:

Access-Control-Expose-Headers: Link

您可以在Restangular文档中获取更详细的信息。 希望对您有所帮助。

3
好的,我会尽力进行翻译。以下是需要翻译的内容:also don't forget to set correct https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Expose-Headers请不要忘记设置正确的 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/访问控制_CORS#Access_Control_Expose_Headers。目的是让服务器在响应中公开指定的响应头,以便客户端能够访问它们。 - Stepan Suvorov
谢谢@STEVER!你说得对,我忘了提到它。我已经编辑了答案。 - troig
1
谢谢troig和STEVER,它确实有效!但是,我还需要设置Access-Control-Allow-Headers: Content-Type。不知道这与什么有关。此外,我成功地将其实现为本地“派生”的Restangular服务,就像https://github.com/mgonto/restangular#how-to-create-a-restangular-service-with-a-different-configuration-from-the-global-one中所述,使我能够在特定页面上专门使用此行为。 - SputNick

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