java - URL 编码查询路径中的字符 @
问题描述
有些地方/库似乎将 URL 路径段中的“@”字符视为应编码的“特殊字符”,而有些地方/库则不考虑。
我正在寻找正确的版本。示例字符串:“someone@example.com”。
- 如果我去https://www.urlencoder.org/并尝试对上面的字符串进行编码,我会得到某人%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”?
解决方案
有些地方/库似乎将 URL 路径段中的“@”字符视为应编码的“特殊字符”,而有些地方/库则不考虑。
在路径段中必须对字符进行转义的标准是RFC 3986,附录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 编码表示。没有什么明确的,但是这个关于未保留字符的观察是一个提示:
取消引用 URI 时,必须解析和分离对特定于方案的取消引用过程(如果有)重要的组件和子组件,然后才能安全地解码这些组件中的百分比编码八位位组,否则数据可能会被误认为组件分隔符。唯一的例外是与未保留集中的字符相对应的百分比编码八位字节,可以随时解码。例如,与波浪号(“~”)字符对应的八位字节通常被旧的 URI 处理实现编码为“%7E”;"%7E" 可以替换为 "~" 而不会改变其解释。
这表明允许对未保留字符进行 pct 编码,即使这显然不是必需的。因此,在解决分隔符后,其他字符也应该如此。
供参考:未保留的集合几乎是您所期望的。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
推荐阅读
- c# - Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") 总是返回 0
- r - 使用示例数据框在 R 中创建人工数据框
- pact - AMQ 消息 V3.0 合约中的 stringType 匹配器进行文字匹配而不是类型匹配
- sql - 从新旧表参考更新表列
- python - 带有三引号的 Jupyter Notebook Python 自动文档字符串生成
- xml - 什么是
和 ? 有没有人知道这个? - scala - 如何仅将空数据帧标题写入 csv 文件?
- postgresql - 触发器创建时出现“SET 处或附近的语法错误”
- python - 数据框列值组合?
- compilation - 如果在 symtab 中提到符号但在 readelf 输出的 dynsym 中没有提到符号,这意味着什么?