2013-10-19 125 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; 
    } 
}];