【发布时间】:2016-11-29 08:35:49
【问题描述】:
我需要发送一个获取请求,其中 url 的最后一部分是一个 json 值。我已经对以下{"period":"600s"} 进行了编码,以便在多个不同的站点上使用,但是它们都得出了相同的结果,其中: 没有被解码。
编码后的网址:stickiness=%7B%22period%22%3A%22600s%22%7D。
那么我该如何编码:?
【问题讨论】:
我需要发送一个获取请求,其中 url 的最后一部分是一个 json 值。我已经对以下{"period":"600s"} 进行了编码,以便在多个不同的站点上使用,但是它们都得出了相同的结果,其中: 没有被解码。
编码后的网址:stickiness=%7B%22period%22%3A%22600s%22%7D。
那么我该如何编码:?
【问题讨论】:
%3A 是:的编码。 : 在 URI 中保留用于指定端口号(例如,google.com:443 手动指定使用端口 443,默认为 HTTPS 端口)。如果你想在 URI 中包含 :,它必须是 precent-sign-encoded,这就是 %3A。无法在 URL 栏中对其进行解码,因为它会违反 : 字符的保留用途。
【讨论】:
:,或者只是它可以工作但它不会将: 显示为本身,而是作为编码字符?
: (%3A)。 “只是它会工作,但它不会显示 : 作为它本身,而是作为编码字符?”是的。
冒号字符在浏览器中没有被解码,因为它属于 the reserved characters,在其他地方的 URL 中已经具有明确的含义 - 在这种情况下,将协议与主机名和主机名后面的端口分开。
相关标准为RFC 1738,第3页:
许多 URL 方案保留某些字符以表示特殊含义: 它们在 URL 的特定于方案的部分中的外观具有 指定的语义。如果对应八位字节的字符是 在方案中保留,必须对八位字节进行编码。那些角色 ”;”, “/”、“?”、“:”、“@”、“=”和“&”是可能的字符 为方案中的特殊含义而保留。其他角色不得 在方案中保留。
通常,当八位字节是 URL 时,URL 具有相同的解释 由一个字符表示以及它何时编码。然而,这并不是 保留字符为真:编码为 a 保留的字符 特定的方案可能会改变 URL 的语义。
因此,只有字母数字、特殊字符“$-_.+!*'()”和 可以使用用于其保留目的的保留字符 在 URL 中未编码。
【讨论】: