2015-09-24 187 views
3

我有它返回一个Link HTTP标头的PUT的响应,指示新创建实体的URL一个REST服务器:Restangular:如何获取HTTP响应头?

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

是否有可能读取与Restangular该链接标题?

拦截HTTP请求与Restangular唯一的工厂,到目前为止我见过是注册在应用程序配置的响应拦截:

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

然而,在上述地点执行演示,唯一的HTTP标头获取日志记录是content-type。尽管如此,我仍然可以在浏览器开发工具栏中看到确实带有许多其他HTTP响应标头,例如Server,Date和上述Link

为什么我无法通过addResponseInterceptor()访问完整的HTTP响应头数组? 有没有什么办法可以使用Restangular捕获有问题的HTTP响应头?

注意:我不搜索使用HAL或任何其他特殊响应主体格式的答案。我想知道我是否可以使用带有Restangular的纯HTTP头(如果没有,我可能会诉诸HAL或其他)。

+0

嗨!帮助你解决问题吗?保持印象,STEVER建议的编辑很重要。 – troig

回答

9

你不需要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,不直接响应。

编辑:正如@STEVER指出,您还需要在您的服务器API中使用expose the headers。 例子:

Access-Control-Expose-Headers: Link 

可以在Restangular documentation

获得更详细的信息,希望它能帮助。

+2

也不要忘记设置正确的https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Expose-Headers –

+0

谢谢@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-从全球范围内,允许我在特定页面上使用此行为。 – SputNick