GET和POST方法的区别
Posted 狱典司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GET和POST方法的区别相关的知识,希望对你有一定的参考价值。
- 安全性角度
一般认为POST在传输数据时更加的安全,因为GET传输时将在URL中显示参数,而POST的数据则放在了请求体(body),所以更安全。
然而安全性的说法存在着两个问题:
- 抓包后POST请求也是能看到请求体(body)中的数据
- HTTP规范并未规定说 GET 就不能在请求体(body)中传输数据
浏览器由于规范问题不会在GET的请求体中添加数据,但是可以通过例如Fiddler的Composer来添加数据到GET的请求体种。
- 数据量的角度
常见的GET和POST区别还有GET传输的数据比较少,POST传输数据多;
- 这是由于浏览器和服务器均对URL的长度进行了限制,因此表现出了GET传输数据少(一般最多2048B)的缺点。
- 而对于POST请求,由于数据放在请求体中,虽然理论上不会受到限制,但是实际开发中各个服务器也会对POST的数据大小进行一定的限制;比如nginx默认上传图片的大小是2mb,图片超过2mb就会提示413 Request Entity Too Large。
因此不管GET还是POST,数据传输大小都会有限制,只是POST的传输大小相对于GET来说比较大;数据量大小也并不是面试官期望听到的回答。
- 缓存角度
GET请求多是用来获取数据的,通常可以缓存。
而POST请求多是用于将表单数据提交到服务端,比如修改姓名、修改密码等操作,需要浏览器必须发送请求到达服务器才能进行操作,因此POST请求不能被缓存。
我们同时将GET和POST请求在浏览器中多提交几次,会发现不管多少次提交,POST请求都是200;而GET请求第一次200,后面的请求会304进行缓存下来。
- 编码角度
GET请求由于请求数据一般都是在URL上,所以GET一般都是URL编码;
而POST请求由于请求参数的多样性,因此有多重编码方式;一般POST请求有application/x-www-form-urlencoded、multipart/form-data和application/json三种传输方式(在HTTP请求报文中的Content-Type中有所体现)。
- multipart/form-data一般在上传文件的时候通过html5的FormData新特性来构造上传表单对象会用到这种编码方式
- application/x-www-form-urlencoded是Form表单的默认提交方式,这种方式的好处就是浏览器都支持;但是缺点是在请求发送前需要对数据进行序列化处理,以键值对形式,例如:key1=value1&key2=value2的形式发送到服务器;
- 如果使用jQuery的ajax方法,它内部已经对JSON格式的数据进行了序列化处理了;而使用axios默认使用application/json进行编码,或者自己通过原生Ajax请求就需要自己进行序列化。
随着JSON规范越来越流行,并且浏览器支持程度比较好,application/json编码也越来越被更多的开发者使用;通过Content-Type告诉服务器主体内容是JSON格式的字符串,服务器端就会进行解析;这样的好处是前端人员不需要关心数据结构的复杂度,只要是标准的JSON格式就能提交成功。
- TCP角度
get会产生一个TCP数据包,POST会产生两个TCP数据包。
- get会发送http header和data给服务端,服务端返回一个200,请求成功。
- post会先发送http header给服务端,告诉服务端等一下会有数据过来,服务端返回100,告诉客户端我已经准备接收数据,post在发送一个data给服务端,服务端返回200,请求成功。
- 幂等性角度
HTTP的幂等是指无论调用多少次,无论调用一次还是一千次,都具有同样的副作用。
GET请求用于获取资源,不管调用多少次接口,都不会影响返回的资源;因此我们说GET请求是幂等的。
而POST请求很明显是非幂等的,因为请求多次,都会产生不同的资源。比如在支付中,我们调用POST请求,虽然我们每次就支付一块钱,但是每次必然会产生不同的订单。
注意,我们这里强调的是一次和N次对资源产生的副作用是相同的,而非单纯的比较结果相同。比如我们GET /news/1用来获取某个新闻,不管我们调用N次返回的都是新闻,没有产生副作用;但是新闻偶尔会更新,返回的结果可能不尽相同。
其他常用的HTTP方法
- HEAD:与GET相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用, 而无需传输整个内容 。
- PUT:用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。它会 将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服 务器可以使用该URI创建资源。
- DELETE:用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。
- CONNECT:要求在与代理服务器通信时建立隧道,使用SSL和TLS协议把通信内容加密后经网络隧道传输
- TRACE:追踪路径(通常不用,易收到XST攻击)。
以上是关于GET和POST方法的区别的主要内容,如果未能解决你的问题,请参考以下文章