Angularjs $ resource url拦截url编码

时间:2013-10-19 12:03:46

标签: javascript angularjs

我正在开发一种连接到RESTFUL文件api的文件管理器应用程序。 在角度应用程序中,每个文件和目录都是角$resource的实例,使用文件对象属性relativePathName作为资源ID。

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

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

我的问题是,有没有办法在资源构造函数内部的private Router instance生成后修改请求网址?如果是这样,怎么样(在文档中没有发现这个)?什么是可能的解决方案?将relativePathName作为参数传递而不是将其声明为资源ID(这需要修改API)?

提前致谢。

托马斯

3 个答案:

答案 0 :(得分:1)

使用$ resource并不是RESTful服务调用的一站式服务,它只是一种以某种方式构建的api的便捷服务。如果$ resource无法满足您的需求,只需使用符合您要调用的API的$ resource和$ http混合创建自己的服务。

答案 1 :(得分: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}
            }
        );
}

]);

答案 2 :(得分:0)

  

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

我不确定资源构造函数的内部,但是您可以使用interceptors以编程方式更改路径网址后由$ resource生成。

<强>结构

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;
    }
}];