我正在开发一种连接到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)?
提前致谢。
托马斯
答案 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;
}
}];