每个 Web 开发者都应该知道的关于 URL 编码的知识
PartDataSchemehttpHost addresswww.google.com
如果我们看一个更复杂的URL,比如 "https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third" 我们就能获取到下列信息:
PartDataSchemehttpsUserbobPasswordbobbyHost addresswww.lunatech.comPort8080Path/filePath parametersp=1Query parametersq=2Fragmentthird协议?(即scheme,如上面的http和https?(安全HTTP)) 定义了URL中其余部分的结构。大多数互联网URL协议?拥有通用的开头,包括用户,密码,主机名和端口,后面才是每个协议具体的部分。这个通用的部分负责处理认证,同时它也有能力知道为了请求数据应该链接到哪儿。
每一个path片段?可以有可选的?path参数?(也叫?matrix参数),这是在path片段的最后由";"开始的一些字符。每个参数名和值由"="字符分隔,像这样:"/file;p=1",这定义了path片段?"file"有一个?path参数?"p",其值为"1"。这些参数并不常用 — 这得清楚 — 但是它们确实是存在,而且从?Yahoo?RESTful?API 文档我们能找到很好的理由去使用它们:
用的非常多。Matrix参数可以让程序在GET请求中可以获取部分的数据集。参考数据集的分页。因为matrix参数可以跟任何数据集的URI格式的path片段,它们可以在内部的path片段中被使用。
一个HTTP URL的最后部分是一个段落(fragment)部分,用来指向HTML文件中具体的某个部分,而不是整个HTML页面。比如说,当你点击链接时浏览器自动滚屏到某个部分而不是从页面最顶部开始展示,就说明你点击了一个拥有段落部分的URL。
部分值协议http主机example.com路径/:@-._~!$&'()*+,=路径参数名:@-._~!$&'()*+,路径参数值:@-._~!$&'()*+,==查询参数名/?:@-._~!$'()* ,;查询参数值/?:@-._~!$'()* ,;==段/?:@-._~!$&'()*+,;=PartValueSchemehttpHostexample.comPath segmentblue%2Fred%3Fand+greenDecoded Path?segmentblue/red?and+green这样看来, 我们是在请求一个名为"blue/red?and+green"的文件,而不是一个位于"blue"文件夹下的名为"red?and+green"的文件。
如果我们把它解码为"http://example.com/blue/red?and+green",我们将得到如下部分:
PartValueSchemehttpHostexample.comPath segmentbluePath segmentredQuery parameter nameand green这明显是错误的,所以,对保留字和URL各部分的分析必须在URL解码之前完成。这意味着URL重写过滤器不应当在尝试匹配之前解码URL,当且仅当保留字允许进行URL编码时才可以(有时符合这种情形,有时不符合,这取决于你的应用)。
有效的URL。它跟我们解码之前的URL非常的不同。当你觉得自己已经拿到了URL的黑腰带(柔道中的最高级别--译者注),你将会发现仍有一些Java里特有的、URL相关的陷阱。如果没有一个强大的心脏,你很难正确的处理URL。
"http://example.com/a/b?c" 转换回之前它的原样,因为它碰巧是一个有效的URL。之前我们已经解释过这一点。下面是正确的代码:
我希望阐明一些URL技巧和常见的错误。简而言之,能把它说明白就够了,但这不是一些人想象的那样简单的。我们展示了java常见的错误和一个web 应用部署的整个过程。现在每个读者都应该是一个URL专家了,并且我们希望不要在看见相关bugs再出现。请求SUN公司,请为URL encoding/decoding逐项的增加标准支持
?
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照?CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
?
转自:http://www.oschina.net/translate/what-every-web-developer-must-know-about-url-encoding