2015-02-09 64 views
16

我基本上叫get請求,就像這樣:

var resource = $resource('/api/v1/categories/:id') 

resource.get({id: 1}).$promise.then(function(data){ 
    console.log(data) 
}) 

這工作得很好..但我怎麼得到的迴應頭?

回答

37

您可以使用transformResponse行動defined here這將允許您添加標題

$resource('/', {}, { 
    get: { 
     method: 'GET', 
     transformResponse: function(data, headers){ 
      response = {} 
      response.data = data; 
      response.headers = headers(); 
      return response; 
     } 
    } 

看到這裏JSFiddle

+1

這個作品,謝謝 – Nathan 2015-02-09 10:13:17

+0

不適用於較新的版本。轉換響應的函數現在應該返回反序列化的數據 – EvAlex 2016-05-17 12:12:05

+0

只需訪問在您的數據之後作爲第二個參數傳遞的'headersGetter'函數。看到下面或這裏的答案:https://docs.angularjs.org/api/ngResource/service/$resource – Sean 2016-06-19 19:05:34

15

@馬丁的回答工作示例適用於同一域中的請求。所以我想補充他的回答,如果您使用跨域請求,您將不得不添加另一個標頭Access-Control-Expose-Headers: X-Blah, X-Bla以及Access-Control-Allow-Origin:*標頭。

其中X-BlahX-Bla是自定義標題。

此外,您不需要使用變換請求來獲取標題。您可以使用此代碼:

var resource = $resource('/api/v1/categories/:id') 

resource.get({id: 1}, function(data, headersFun){ 
    console.log(data, headersFun()); 
}) 

this小提琴。 希望這有助於!

+0

我認爲這比目前接受的更方便回答(至少在2016年)。 Angular會自動爲第二個參數提供標題值(不要忘記使用paranthesis,因爲這是一個函數,而不是直接對象)。 – beawolf 2016-04-23 15:03:45

+0

關於跨域和關於頭函數在'then'函數中作爲第二個參數的相關性不那麼重要 - 我幾乎錯過了這個,因爲您的跨域信息! – Sean 2016-06-19 19:03:45

+2

你在這裏和在小提琴中寫的東西之間有一個微妙但非常重要的區別。小提琴使用帶回調的get調用來獲得成功和錯誤,並且在那種情況下headersFun存在。但是,如上所述,通過'$ promise.then'處理響應沒有第二個參數 - 「headersFun」未定義。 – Danny 2017-01-18 15:35:41

4

老問題,但我認爲值得一提的是未來的參考。 有「官方」角文檔在此解決方案:

值得一提的是,對於GET,查詢等 方法的成功回調在來自服務器以及 爲$響應被傳遞HTTP頭吸氣劑的功能,所以一個可以把上面的例子 ,並獲得訪問HTTP標頭爲:

var User = $resource('/user/:userId', {userId:'@id'}); 

var users = User.query({}, function(users, responseHeaders){ 
    // ... 
    console.log(responseHeaders('x-app-pagination-current-page')); 
}); 

(代碼從文檔略微更新的清晰度)

對於CORS請求,需要公開其他答案中提到的標頭。