angular-resource.js encodeUriSegment 问题
Posted
技术标签:
【中文标题】angular-resource.js encodeUriSegment 问题【英文标题】:angular-resource.js encodeUriSegment Issue 【发布时间】:2014-01-04 08:47:15 【问题描述】:当资源 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 中尝试了很多技巧来完成这项工作;但唯一的解决方案是添加以下最后一行 replace(/%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, '/');
谢谢。
【问题讨论】:
【参考方案1】:好像你已经在github上遇到过这个问题了:
https://github.com/angular/angular.js/issues/1388#issue-6979382
建议您采用的方法在哪里。就我而言,因为我和你有同样的问题,我更喜欢拥有多个服务(每个子路径一个)而不是修改angular-resource.js
- 我更喜欢不修改核心库文件,因为任何更新都会清除这些更改.
希望在 Angular 中添加一个用于设置 uri 编码的标志来解决这个问题。
【讨论】:
【参考方案2】:你可以使用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);
;
);
]);
请记住,它会拦截所有 URL。
【讨论】:
【参考方案3】:基于@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”在 url 中的位置。
随着我越来越多地使用角度资源,我发现使用和理解 $httpProvider.interceptors 变得越来越重要。
【讨论】:
以上是关于angular-resource.js encodeUriSegment 问题的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS ——ngResourceRESTful APIs 使用
ruby字符串的encoding,force_encoding,encode,encode!转码(编码转换)
x264代码剖析:encode()函数之x264_encoder_encode()函数