URL编码查询路径中的字符@

时间:2019-06-07 16:19:14

标签: java rest http urlencode

有些场所/库似乎将URL路径段中的“ @”字符视为应进行编码的“特殊字符”,而某些地方/库则不这样做。

我正在寻找正确的版本。 示例字符串:“ someone@example.com”。

  • 如果我转到https://www.urlencoder.org/,并尝试对上述得到的String进行编码 someone%40example.com
  • 如果我使用的是org.springframework.web.util.UriUtils,则会得到以下结果:

    String s1 = UriUtils.encodePathSegment("someone@example.com", "UTF-8"); String s2 = UriUtils.encodeQueryParam("someone@example.com", "UTF-8"); String s3 = UriUtils.encodePath("someone@example.com", "UTF-8"); System.out.println("----------s1: " + s1); System.out.println("----------s2: " + s2); System.out.println("----------s3: " + s3);

...输出

----------s1: someone@example.com
----------s2: someone@example.com
----------s3: someone@example.com
  • RestEasy-Client v4.0.0.Final不在路径段中编码“ @”字符
  • WSO2 ESB收到包含@ char的Path参数时抱怨(嗯,它在所述时刻找不到资源)。

谁是正确的,正确的结果是什么,应该将“ @”转换为“%40”吗?

2 个答案:

答案 0 :(得分:1)

  

有些场所/库似乎将URL路径段中的“ @”字符视为应进行编码的“特殊字符”,而某些地方/库则不这样做。

在路径段中必须转义字符的标准是RFC 3986, Appendix A

path          = path-abempty    ; begins with "/" or is empty
              / path-absolute   ; begins with "/" but not "//"
              / path-noscheme   ; begins with a non-colon segment
              / path-rootless   ; begins with a segment
              / path-empty      ; zero characters

path-abempty  = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty    = 0<pchar>

请注意,根据您使用的路径生产方式,可以使用三种不同的细分受众群

segment       = *pchar
segment-nz    = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
              ; non-zero-length segment without any colon ":"

但是...

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

因此,@可以在任何路径段中使用。

需要吗?据我所知,答案是否定的-当@不充当分隔符时,允许使用pct编码表示。没有明确的内容,但这observation about unreserved characters是一个提示:

  

当对URI进行取消引用时,对于特定于方案的取消引用过程(如果有)重要的组件和子组件,必须先解析和分离,然后才能安全地解码这些组件中的百分比编码八位位组,否则可能会误认为组件分隔符。唯一的例外是与未保留集中的字符相对应的百分比编码八位位组,可以随时对其进行解码。例如,与波浪号(〜)字符相对应的八位字节通常由较旧的URI处理实现编码为“%7E”;可以将“%7E”替换为“〜”,而无需更改其解释。

这表明允许使用未保留字符的pct编码,即使这显然不是必需的。因此,在解析定界符之后,其他字符也应如此。

仅供参考:未保留的集几乎与您期望的一样。

unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

答案 1 :(得分:0)

如果您调用class之类的URL,它将使用您的凭据将您连接到该端点。因此,那时我不会逃避它们。但是,如果它们出现在login(:password)@url.com之后,我将对其进行转义,因为它们不应用作分隔符。