2

我正在开发一种连接到 RESTFUL 文件 api 的文件管理器应用程序。在 Angular 应用程序上,每个文件和目录都是 Angular 的一个实例,$resource使用 file-object 属性relativePathName作为资源 id。

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

问题是,在更新文件资源时,relativePathName参数会被 url 编码,例如/变为%2F导致服务器在请求到达实际 API 之前拦截请求(我假设服务器将其视为物理地址并返回 404 响应) . 该 API 能够将整个 url 段视为单个参数,因此基本上它会将其path/to/file视为 uri 参数http://myapp.com/api/files/create/path/to/file而不是不同的 uri。

我的问题是,有没有办法在资源构造函数内部的私有路由器实例生成请求 url 后修改它?如果是这样,如何(在文档中对此一无所获)?什么是可能的解决方案?作为参数传递relativePathName而不是将其声明为资源 id(这需要修改 API)?

提前致谢。

托马斯

4

3 回答 3

1

使用 $resource 并不是 RESTful 服务调用的一站式服务,它只是以某种方式构建的 api 的便利服务。如果 $resource 不能满足您的需求,只需使用适合您尝试调用的 api 的 $resource 和 $http 组合创建您自己的服务。

于 2013-10-19T17:05:35.890 回答
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}
            }
        );
}

]);

于 2014-03-24T17:02:21.857 回答
0

我的问题是,有没有办法在资源构造函数内部的私有路由器实例生成请求 url 后修改它?

我不确定资源构造函数的内部,但您可以使用拦截器在 $resource 生成路由 url 后以编程方式更改它们。

结构体

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;
    }
}];
于 2015-12-29T06:35:38.963 回答