当有一个 $resource 并发送一个要在 url 中使用的参数时,如果有一个不对其进行编码的选项会很好。 OOB 它在与 url 匹配之前对参数进行编码(在本例中为“路径”)。 例如
// In SomeResourceName factory:
$resouce('/:path', { path: 'default.json' }, ...)
// Useing SomeResourceName
SomeResourceName.get({ path: 'game/mygame.json' })
这将导致调用 url "/game%2Fmygame.json" 而不是 "/game/mygame.json"。
有一个快速修复的解决方法:
// In angular-resource.js and method encodeUriSegment
function encodeUriSegment(val) {
return encodeUriQuery(val, true).
replace(/%26/gi, '&').
replace(/%3D/gi, '=').
replace(/%2B/gi, '+').
replace(/%2F/gi, '/'); // <--- Add this line
}
我不知道什么会破坏,但据了解它对我有用。 还可以劫持 ResourceFactory 中的 actions 参数,并将跳过编码标志传递给 Route 构造函数的默认参数,以告诉它跳过编码。
创建了劫持更改的要点:) https://gist.github.com/3749345
对此+1。 提供更大的灵活性。 在我们的用例中,我们将 spring data rest 用于后端,搜索方法是我们需要映射到操作的路径参数,理想情况下在与基本 CRUD 操作相同的资源对象中。
+1。 我们的 id 包含斜杠(我们使用 RavenDB),如果不编码,这将是一个干净的解决方案
将其设为可选很好,但请确保默认启用它。
不建议对 URI 进行编码。 现在不这样做可能看起来“干净”,但我向你保证,它会在今生或来世咬你一口。
如果我正确阅读了http://www.ietf.org/rfc/rfc3986.txt ,我们应该允许片段的未编码斜线。
3.5. 分段
URI 的片段标识符组件允许间接
通过参考主要资源来识别次要资源
资源和其他识别信息。 确定的
次要资源可能是主要资源的某个部分或子集
资源,对主要资源表示的一些看法,或
由这些表示定义或描述的其他一些资源。 一个
片段标识符组件由存在的指示
数字符号 ("#") 字符并以 URI 结尾终止。fragment = *( pchar / "/" / "?" )
...
允许使用斜杠(“/”)和问号(“?”)
表示片段标识符内的数据。 当心一些
旧的、错误的实现可能无法正确处理这些数据
当它用作相对引用的基本 URI 时(第
5.1)。
用例: $location.hash('/secondary-resource')
我只是好奇,是否可以通过对参数进行双重编码来避免这个问题?
对不起,它使情况变得更糟。 只是为了确认我尝试了一些打开,即使它感觉是徒劳的!
'/', '%252F' --> %25252F
还,
/ %2f --> %252F
'/', '//' --> %2F%2F
谢谢你的想法。 请求仍然有效。
今天碰到这个。 +1
我可能不喜欢它,但我们的 id 也包含斜线。 这需要是可选的。
+1
+1
+1
+1
+1
+1
我看到提到的数据库(RavenDB)使当前的实现出现问题,但我希望有一个中间服务器需要编码组件,并在后端将它们解码为正确的 ID。 有人可以提供一个更具体的用例来说明强制编码导致问题的地方(抱歉,我没有更多关于 RavenDB 的上下文)?
对于 $resource 的当前设计,我们犹豫是否允许这样做,因为它会使用户输入很容易影响请求的路径。
我将 $location 用于 REST/超媒体设计,而不是 RavenDB(或 $resource)。 我不得不使用库的补丁版本。
我也在寻求确认,事实上这个提案也确实遵循了RFC——见我上面的评论
我也可能对图书馆有点生疏——如果我错了,请深表歉意——还有两个实现,一个在L332 的资源中,一个在Angular 的 1071 。
我只需要 Angular 中的那个,因为它是 $location 所使用的 ;-)(是的,我在这里看到了问题,所以我不建议没有不同的实现)。 抱歉,如果我有任何不正确的分析。
+1
任何人都有构建包含正斜杠的资源 URL 的解决方法?
这方面有什么动静吗?
只需添加一点,我自己就可以真正使用这样的选项。
嘿,
我有同样的问题,但要点并没有使它对我有用。 我必须在哪里放置这个 encodeUirSegment 方法或者我可以在哪里放置这个选项? :/
我正在使用 HTTP 拦截器来转换 URL。 它一直有效,直到我在 IE11 上进行测试。 对 IE11 中包括%
在内的 URL 的 XHR 请求会出现 Angular 中断。 不确定IE10。 Angular 应该支持 IE9+(参考)
猜猜我要回到修改后的ngResource ..
@connorbode ---老兄,就像你的问题中提到的那样,写一个失败的测试用例=)这条路径应该已经被覆盖了,所以有两种可能性,要么它没有被覆盖而且应该被覆盖,或者你正在做一些事情来打破这。
让我们找出它是什么!
+1
+1
+1
无法使用 CouchDB 和设计文档 (_design/cafehub/_view/menu_items)
你们可以+1我的拉取请求而不是这个问题吗? 它解决了这个问题,但自提交以来通常被忽略。 https://github.com/angular/angular.js/pull/7940
+1
确实需要它来与一些不执行 URLdecode 的遗留 web 服务交互
+1
在某些可行的、有用的情况下,用户希望禁用 URL 参数的编码(例如,您希望将资源路径附加到基本 URL 的位置)。
+1
+1
+1
+1
@toddb仅供参考,您的规范引用是指 URL 的片段部分,即#foo/bar
部分,其中转义斜线确实不需要或不合适。 但是这个错误是关于转义 URL 的主路径部分中的斜杠。 一般来说,我认为 RFC 并不适用于此,Angular 的 $resource 服务如何处理模式匹配和 URL 构造真的与 RFC 无关。
在常规的:param
样式参数中不转义斜线会导致模式不可逆的问题。 例如,如果您有/x/:param
,并且您允许为{param: 'y/z'}
生成/x/y/z
#$ ,则生成的/x/y/z
将无法针对 URL 模式进行解析。
恕我直言,在 URL 模式中有一个功能来接受吃斜杠的星形模式可能是有意义的,例如"/:param1/:param2/*pathParam"
,其中*pathParam
会吃 URL 中的斜杠。 对于*
参数,在不转义斜杠的情况下也接受斜杠是有意义的。
@mpprobst - 你是非常正确的,我只在片段周围记录了一个错误。 我使用它的代码_也_会影响片段。 我没有使用$resource
服务,而是使用$location
。 如果我没记错的话,uriSegment 代码有几个实现。
@connorbode快速阅读的补丁将解决这个问题。 干杯
+1
+1
+1
+1
+1
+1
+1
+1
您可以使用与 ui-router lib 中相同的语法:
http://angular-ui.github.io/ui-router/site/#/api/ui.router.util.type :UrlMatcher
+1
它也发生在位置
:+1:
+1
我目前正在进行解码,以便将我的原始网址发送到后端
.factory('decodeUriSegment', () => {
return (url) => {
return url.replace(/@/g, '%40')
.replace(/:/g, '%3A')
.replace(/\$/g, '%24')
.replace(/,/g, '%2C')
.replace(/\+/g, '%20');
};
});
+1
+1
app.config(function($resourceProvider) {
$resourceProvider.defaults.stripTrailingSlashes = false;
});
+1
我在 angularjs $resource 服务中遇到此错误
错误:encodeUriSegment 不是函数
@ibrahim89 ,确保您使用相同版本的角度和角度资源。
@gkalpak ,谢谢!!
我的错误已解决
最有用的评论
@ibrahim89 ,确保您使用相同版本的角度和角度资源。