HTTP400错误和URLEncode
今天被URLEncode坑得报了一整天的HTTP400错误,特此总结一下。
1. URLEncode
1.1. 什么是URLEncode
百分号编码(Percent-encoding), 也称作URL编码(URL encoding), 是一种URL编码机制。
常用的以下几种编码规则:
-
把URL中下图中上一行的字符(保留字符)转换为对应的下一行字符(非保留字符):
-
把URL中的『%』转换为『%25』。 也因而对同一串URL多次进行URL编码会导致其长度会越来越长。如,
http://www.163.com -> http%3a%2f%2fwww.163.com -> http%253a%252f%252fwww.163.com -> ...
我们可以在这个网站进行测试。
- 二进制数据每8个bite进行URL编码。 如字节值0F编码为「%0F」。
1.2. 什么时候会进行URLEncode
- 在『Chrome的地址栏』和输入URL后,他会对URL中『http://』 之后的部分进行隐式的URL编码;
- 在『Postman的地址栏』也会对URL中『http://』 之后的部分进行隐式的URL编码;『Postman的Params栏』则会全部进行URL编码;
这些过程都是透明的。另外,如果在地址栏中输入的URL是自行编码过的URL,它们就不会在对你的URL进行隐式的URL编码,非常的智能!
1.3. 什么时候会进行URLDecode
- Java容器(如Tomcat、Resin等)在收到客户端的消息时,会隐式的进行一次URLDecode,这个过程也是透明的;
- 可以在程序中手动进行字符串URLDecode。
2. HTTP 400错误
2.1. 什么是HTTP 400错误
400 Bad Request
由于包含语法错误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2.2. 什么时候会出现400错误
我们上面讲了URLEncode,当一个URL进行多次URLEncode时,Tomcat只URLDecode一次,这时就会返回400错误。这也是今天遇到的问题。