2013-09-28 29 views
2

有兩種方法,我可以通過ID得到休息資源:

GET /users/1 
GET /users/1,2 

第一返回單個對象像{id:1,name:"John"},而第二返回類似[{id:1,name:"John"},{id:2,name:"Jill"}]陣列。

請不要爭論這是否是合法的REST;只是接受一個服務有這個,我需要與它合作。

角的$資源實際上是智能處理它從要求方:

User.get({users:['1','2']}) 

轉變成

GET /users/1,2 

但它並不處理響應良好。它期望一個單一的對象。如果我將定義更改爲isArray:true,那麼它在單個請求上失敗GET /users/1

如何獲得它以智能地處理兩者?

編輯:我做了一些奇怪的黑客得到它的工作,但希望有一個本地方法:

factory('Resource',['$resource','_',function ($resource,_) { 
    return function(url,params,methods){ 
     var defaults = { 
      getSingle: {method: 'get', isArray:false}, 
      getMultiple: {method: 'get', isArray:true} 
     }, resource = $resource(url,params,angular.extend(defaults,methods)), urlParams = {}; 
    _.each(url.split(/\W/), function(param){ 
    if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(url))) { 
     urlParams[param] = true; 
    } 
    }); 

     // do not override if they did 
     if (!(methods||{}).get) { 
      resource.get = function (params,success,error) { 
       // look for multiples 
       var isMultiple = false; 
       _.each(params,function (val,key) { 
        if (key && urlParams[key] && angular.isArray(val)) { 
         isMultiple = true; 
         return(false); 
        } 
       }); 
       return this[isMultiple?"getMultiple":"getSingle"](params,success,error); 
      }; 
     } 
     return(resource); 
    }; 
}]). 

回答

4

通常慣例是創建一個對象Resource.get()方法和陣列一Resource.query()方法其中。

+1

那麼,查詢是由不同的參數一般查詢。這絕對是一個'get',但對於多個...甚至$ resource都知道在* request *端要做什麼,因爲它會將它轉換爲逗號分隔列表。你說我需要'Resource.getMultiple()'或類似的東西? – deitch

+0

是的,我會嘗試。 –

4

我在嘗試對帖子執行PUT請求時遇到了與WP-API類似的問題。目前,如果一切正常,API將返回表示帖子的對象,但如果出現錯誤(例如授權憑證不匹配),則返回錯誤數組。所以我得到了錯誤Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an object but got an array

我設法通過在我的自定義操作對象上使用transformResponse屬性來找到解決方案。我定義了一個檢查響應的函數,然後如果它是一個數組,它將數組轉換爲一個對象。這似乎工作正常,似乎有點不像你在你的更新發布的解決方案:

var wpPost = $resource(PATH_TO_WORDPRESS_API + 'posts/:id', {}, 
     { 
      'update': { 
       method: 'PUT', 
       params: {id: '@id'}, 
       transformResponse: function(data) { 
        var response = angular.fromJson(data); 

        if (response.length) { 
         // the response is an array, so convert it into an object 
         var object = {}; 
         for(var i = 0; i < response.length; i ++) { 
          object[i] = response[i]; 
         } 
         return object; 
        } else { 
         return response; 
        } 
       } 
      } 
     }); 
+0

這個應該是選擇的anwser,就像改變transformReponse方法中的響應一樣簡單,但是如果你更改if語句if(response instanceof Array)它會更準確 – Strife86