POST请求和GET请求的区别,以及请求报文
POST和GET二者都是HTTP请求的基本方法。POST请求和GET请求的区别经常会在出现在面试题中,自己在这里整理了下。
首先从HTTP规范上讲
GET是从指定的资源请求获取数据,应该是安全而幂等的。这里的安全是指GET就像数据库的查询操作一样,不会修改增加数据,也不会影响资源的状态;
POST是向指定的资源提交要被处理的数据,是用于可能修改指定资源的请求。会像数据库的删除、增加、修改数据一样,可以影响资源的状态。
从安全性上讲(这里的安全与上文的安全不同,这里指用户信息方面的安全性)
GET数据通过URL传递,数据是会直接暴露在URL上,并且数据会保留在浏览器历史中,是能被缓存,可收藏为书签的,所以安全性非常低;*
*POST数据则是放在Request body(即请求报文的请求体)中,数据不会保留在浏览器历史或web服务器日志,不能被缓存,不可收藏为书签,所以POST的安全性要比GET的安全性高。
GET请求和POST请求都有自己的语义,不能随便混用。在发送密码或其他敏感信息时绝对不要使用GET请求!
其他方面
数据长度的限制方面,发送数据时,GET 请求向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。而POST请求是无限制的。
数据类型方面,GET只接受ASCII字符,而POST没有限制。
关于请求报文
一个HTTP请求报文由请求行(request line)、请求头部(request header)、请求体(request body)3个部分组成。
GET请求的请求报文:
POST请求的请求报文:
GET请求和POST请求的请求报文结构上是相同的,但内容是不同的。
请求报文的第一行是请求行。请求行按照 请求方式 地址 协议的顺序构成。
请求行下面是请求头
最后用空行与前面隔开的部分称为请求体
GET请求一般没有请求体,数据一般放在URL中,而POST请求要传递的数据一般放在请求体中。
请求体中的数据一般由请求头中的Content-Type来决定类型,常见的Content-Type有x-www-form-urlencoded 、application/json 、form-data。
值得一提的是不同的数据编码类型在服务器端解析的时候需要使用不同的技术。在做接口对接的时候一定要约定好传递数据的方式