关于http的介绍这不赘述,主要总结下post方法里不同形式的body的提交格式。
先谈谈get与post的区别
很多人说get方法比post方法安全,我本人,这是个片面的说法。在本地环境下,post的参数通常不会保存在浏览器历史里,在提交请求时,get方法的参数直接放在URL上,而post方法则是放在body里,相比于get,post不能直接看到所提交的参数。
想象一下,如果提交的密码是一个参数,而且用get方法,这就会直接将密码暴露在URL中,显然这很不安全。而post不会把参数放在URL中,就是安全的吗?大错特错,下面是通过打开浏览器调试模式查看一个登陆请求的信息
在请求信息传输的过程中,http协议的post方法并不能对提交的参数起到保密作用。get和post
get与post的区别应该是这样的
方法 | get | post |
---|---|---|
数据长度 | 参数放在URL上,由于URL的长度有限,因此能提交的数据内容也很有效。 | 数据或参数放在body中,body可接纳的数据量远大于直接放在URL上 |
数据类型 | 只支持文本(ASCII字符),并且采用urlencode | 支持文本,采用urlencode,也支持二进制,能够用来传输文件 |
post请求的格式
post请求包含两部分,请求头(header)和请求体(body)。先来看一个简单的post请求所携带的内容。
其中该请求的body携带两个参数,param1与param2,其值的java和algorithm。不难发现,参数与头部信息之间有一“空行”,该空行就是一head与body的分割标志,实质上是字符串”\r\n\r\n”作为分隔线。
请求头(header)
请求头包含一系列与请求有关的信息,第一行 POST / HTTP/1.1 表明这是一个post请求,http版本为1.1。
接下来的几行都是与该请求有关的信息,其中Content-Type与content-length是来用于描述请求体(body)的数据类型和数据总长度的。
请求体(body)
请求体格式变化很灵活,可以是纯文本,也可以是二进制数据。必要时需要在请求头(header)的Content-Type属性里声明。常用的纯参数提交的post请求格式如下
x-www-form-urlencode格式
可以发现,请求体(body)的参数实质上也是一个字符串,跟get请求放在URL后面的参数是一样的格式,参数1=值1&参数2=值2….. 整个字符串是被urlencode的,但是这里由于参数是纯英文字母并且不包含特殊字符体现不出来。
除此之外,body还可以是其他格式类型的数据,例如纯文本,纯二进制(通常用来单文件传输)
(body是任意类型纯文本)
(body是纯二进制)
Multipart/form-data格式
既然body数据可以纯文本也可以纯二进制,那么可不可以是文本和二进制的混合型呢?这必须是可以的,因此有了Multipart/form-data格式。
在form-data格式里,header里的Content-Type的值为 Content-Type: multipart/form-data; boundary={#boundary},接着是请求体变成了一种固定的格式,有多个提交”参数”,这里的”参数”可以是文本信息,也可以是二进制数据信息,这里的每一个参数被称为”part”,因此这种格式称为Multipart。
格式说明
:需要在Content-Type里说明,表明这个请求体的格式为Multipart/form-data。
:{#boundary}是一个随机的字符串,紧接在Content-Type: multipart/form-data的后面,这个随机字符串将在请求体中充当“分隔符”的角色,用来分隔多个part,在请求体的最后为 {#boundary}– (注意是{#boundary}拼接上两个”-“),用来表明请求体的内容到此结束。{#boundary}的值是随机的,原则上{#boundary}的值随机性越高越好,因为如果每个part里也恰好包含{#boundary}就很尴尬了,但这个概率还是很低的。
:在两个{#boundary}之间的内容就是每一个part的数据,可以是纯文本数据,也可以是二进制数据。part里也可以被分为header和body,这里它为“小头部”吧。
当这一个part是纯文本参数时,只需要声明 Content-Disposition: form-data; name=参数名 即可,紧接着是”\r\n\r\n”分割,下面的就是参数的值了。
当这一个part是文件的二进制数据时,小头部通常为
Content-Disposition: form-data; name=参数名; filename=文件名
Content-Type: image/png(文件类型)
紧接着是”\r\n\r\n”分隔符,直至下一个{#boundary}分隔符出现为止,都为文件的二进制数据。
小结
form-urlencode 和 form-data 是常用的两种post格式,前者的请求体内容是纯文本或纯二进制,常用语纯文本参数的提交,单文件传输。 form-data能够混合传输文本与二进制,相比于form-urlencode,form-data还能够多文件传输。