URL编码解码

浮生日记

3.26 阴

URL编码

参考:
https://blog.csdn.net/ljhabc1982/article/details/7094757
https://www.cnblogs.com/jerrysion/p/5522673.html
https://www.cnblogs.com/mengff/p/7282488.html
https://blog.csdn.net/danielzhou888/article/details/72861097
URL编码概念捞的不谈。
只有数字,大小写字母,特定的保留字才不会进行URL编码。

Understanding of Content-Type

在HTTP请求和响应投中用Content-Type来表示具体请求中的媒体类型信息。
常见的媒体格式类型如下:

text/html : HTML格式
text/plain :纯文本格式      
text/xml :  XML格式
image/gif :gif图片格式    
image/jpeg :jpg图片格式 
image/png:png图片格式

以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded :

中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

get/post of form

如果enctype为默认的application/x-www-form-urlencoded时:
form的method为get时话,则把参数按照?k1=v1&k2=v2的形式拼接到URL的后面直接访问。
firn的method为post的话,则把参数放以k1=v1&k2=v2的形式到请求体里面。
在有 input type=file 时候,要用multipart/form-data编码方式。浏览器会把表单以控件为单位分割,每个部分使用 –boundary 分割开来,最后一行使用 –boundary– 结尾,
并且为每个部分加上Content-Dispositon(form-data或file)、Content-Type(默认text/plain)、
name(控件name)等信息,并加上分割符(boundary)。
举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
通过form表单提交文件操作如下:

<form method="post"action="http://w.sohu.com/t2/upload.do" enctype=”multipart/form-data”>

<inputtype="text" name="desc">

<inputtype="file" name="pic">

</form>



浏览器将会发送以下数据:

POST /t2/upload.do HTTP/1.1

User-Agent: SOHUWapRebot

Accept-Language: zh-cn,zh;q=0.5

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Content-Length: 60408

Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Host: w.sohu.com



--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Content-Disposition: form-data;name="desc"

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: 8bit



[......][......][......][......]...........................

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Content-Disposition: form-data;name="pic"; filename="photo.jpg"

Content-Type: application/octet-stream

Content-Transfer-Encoding: binary



[图片二进制数据]

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC--

对URL编码的理解:

在浏览器发送请求前,如果发现传入的参数包括了除保留字和非保留字之外的字符,则需要进行URL编码,然后进行传输。
服务器接受到请求后会自动执行一次解码过程。
即:客户端发送请求前确保URL符合规范;否则进行URL编码;->传送到服务端默认进行一次URL解码;然后服务器端进行一次URL编码后发送给客户端->客户端进行URL解码并显示。
那么问题来了。如果我的请求参数中存在特殊符号,那么编码又是什么情况?
比如param1=admin+1
如果这样直接提交请求的话,浏览器检查通过,直接发送(因为+是保留字,被翻译成空格)
在bing搜索123%123 其实搜出来的是123 123

下图是输入编码后的数据%2b的情况:

下图是直接输入+的情况

保留字符不用于URI分隔符,而是用于其它位置,比如参数的value时,要对这时用到的保留字符做URL编码。

比如pa1=admin&pa3 , pa2=123123
如果不对value中的保留字进行编码的话,则结果是这样的:pa1=admin&pa3&pa2=123123
可能存在安全隐患。