当资源uri有多个子路径时,我有一个问题是查询restful资源:
示例:
.factory('SomeFactory', function ($resource) {
return $resource('/path/subPath/otherSubPath/:id', {}, {
show: { method: 'GET', params: { id: '@id' } }
})
}) ;
当我在控制器中调用SomeFactory.show时,我收到错误 服务器响应状态为400(错误请求) 这是因为浏览器正在寻找uri:
http://server/path/subPath%2FotherSubPat/id
注意%2F替换了uri中的/(斜杠),我在javascript中尝试了许多技巧来完成这项工作;但唯一的解决方案是添加以下最后一行替换(/%2F / gi,'/');在angular-resource.js encodeUriSegment方法中。
请告诉我这种方法是否正确。
function encodeUriSegment(val) {
return encodeUriQuery(val, true).
replace(/%26/gi, '&').
replace(/%3D/gi, '=').
replace(/%2B/gi, '+').
replace(/%2F/gi, '/');
}
谢谢。
答案 0 :(得分:1)
好像你已经碰到了在github上打开的这个问题:
https://github.com/angular/angular.js/issues/1388#issue-6979382
建议您采取的方法。就我而言,因为我和你有同样的问题,我更喜欢有多个服务(每个子路径一个)而不是修改angular-resource.js
- 我更喜欢不修改核心lib文件,因为任何更新都会擦除那些变化。
希望将有关uri编码的标志添加到Angular中以解决此问题。
答案 1 :(得分:1)
您可以使用http拦截器:
module.constant("interceptULRS",
[new RegExp('.+/path/.*')]);
module.config(['$httpProvider', 'interceptULRS', function($httpProvider, interceptULRS) {
var ENCODED_SLASH = new RegExp("%2F", 'g');
$httpProvider.interceptors.push(function ($q) {
return {
'request': function (config) {
var url = config.url;
for (var i = 0; i < interceptULRS.length; i++) {
var regex = interceptULRS[i];
if (url.match(regex)) {
url = url.replace(ENCODED_SLASH, "/");
// end there is only one matching url
break;
}
}
config.url = url;
return config || $q.when(config);
}
};
});
}]);
请注意,它会拦截所有网址。
答案 2 :(得分:0)
建立@Pavol我认为你可以将请求功能削减到
var ENCODED_SLASH = new RegExp("%2F", 'g');
var request = function (config) {
var matches = config.url.match(ENCODED_SLASH);
if (matches && matches.length) {
config.url = config.url.replace(ENCODED_SLASH, "/");
}
return config || $q.when(config);
};
如果您在其他地方不需要ENCODED_SLASH,并且不关心“%2F”在网址中的位置。
随着我越来越多地使用角度资源,我发现使用和理解$ httpProvider.interceptors更重要。