网络协议学习——HTTP协议POST方法的格式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kurozaki_Kun/article/details/78646960

关于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还能够多文件传输。

猜你喜欢

转载自blog.csdn.net/Kurozaki_Kun/article/details/78646960