Angular.js: 资源中的 encodeUriSegment 编码参数,应该是可选的

创建于 2012-09-19  ·  55评论  ·  资料来源: angular/angular.js

当有一个 $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 构造函数的默认参数,以告诉它跳过编码。

Lots of comments ngResource moderate more info feature

最有用的评论

@ibrahim89 ,确保您使用相同版本的角度和角度资源。

所有55条评论

创建了劫持更改的要点:) 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;
});

https://github.com/angular/angular.js/pull/5560

+1

我在 angularjs $resource 服务中遇到此错误
错误:encodeUriSegment 不是函数

@ibrahim89 ,确保您使用相同版本的角度和角度资源。

@gkalpak ,谢谢!!

我的错误已解决

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

awerlang picture awerlang  ·  3评论

brijesh1ec picture brijesh1ec  ·  3评论

ashclarke picture ashclarke  ·  3评论

nosideeffects picture nosideeffects  ·  3评论

kishanmundha picture kishanmundha  ·  3评论