2013-10-19 119 views
2

我正在處理一種連接到RESTFUL文件API的文件管理器應用程序。 在角度應用上,每個文件和目錄都是使用文件對象屬性relativePathName作爲資源ID的角度爲$resource的實例。

js var File = $resource(url + '/:type/:id', {id: '@relativePathName', type: '@type'}, {…});

問題是,更新文件資源時,所述relativePathName參數獲取URL編碼,例如/變成%2F這會導致服務器在它碰到實際的API之前攔截請求(我假設服務器將其視爲物理地址並返回404響應)。該API能夠將整個網址段作爲單個參數進行處理,因此基本上它會將path/to/file作爲參數http://myapp.com/api/files/create/path/to/file的uri參數,而不是作爲不同的URI。

我的問題是,是否有一種方法可以在資源構造函數內部生成private Router instance之後修改請求url?如果是這樣,如何(在文檔中沒有發現這一點)?什麼是可能的解決方案?將relativePathName作爲參數傳遞,而不是將其聲明爲資源ID(這將需要修改API)?

在此先感謝。

托馬斯

回答

1

使用$資源不是RESTful服務調用的一站式服務,它僅僅是對API的那些以某種方式構成的便民服務。如果$ resource無法滿足您的需求,只需使用適合您嘗試調用的api的$ resource和$ http組合創建自己的服務即可。

+0

謝謝,這可能是唯一的方法。經過一番修改之後,我最終擴展了由'$ resource()'檢索的構造函數,並重寫'$ get',因爲這是唯一對我編碼的url參數至關重要的方法。 – iwyg

0

在我們的應用程序,我們想爲GetByName方法要求不同的URL,所以我們用行動GetByName方法的,像這樣的URL參數覆蓋資源地址:

myapp.factory('ListGroup', ['$resource', 
    function($resource) { 

     return $resource(
      '/API/List/:Id', 
      { 
       Id:'@Id', 
       Name:'@Name' 
      }, 
      { 
       getByName: {method: 'GET', url: '/API/List/Group/:Name', isArray: true} 
      } 
     ); 
} 

]);

0

我的問題是,是否有一種方法來修改請求的url後,由資源構造函數內的私人路由器實例生成?

我不知道內部資源構造但你可以使用interceptors以編程方式改變路線的網址,他們已經由$資源產生之後。

結構

hooks.config.js 
hooks.factory.js 
hooks.module.js 

hooks.module.js

module.exports = angular 
        .module("app.hooks", []) 
        .factory("hooks", require("./hooks.factory.js")) 
        .config(require("./hooks.config.js")); 

hooks.config.js

module.exports = ["$httpProvider", function($httpProvider) { 
    $httpProvider.interceptors.push("hooks"); 
}]; 

hooks.factory.js

module.exports = ["$q", "$location", function($q, $location) { 

    var basePrefix = "/api/v1"; 

    return { 
     //invoked on every http request 
     request: function(request) { 
      request.url = interpret(request.url); 
      return $q.when(request); 
     } 
    }; 

    function interpret(str) { 
     //if requesting an html template, don't do anything 
     if (str.indexOf(".html") > -1) 
      return str; 
     //if you're accessing the api, append the base prefix globally here 
     else 
      return basePrefix + str; 
    } 
}];