GET和POST方法的区别

Posted 狱典司

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GET和POST方法的区别相关的知识,希望对你有一定的参考价值。

  1. 安全性角度

一般认为POST在传输数据时更加的安全,因为GET传输时将在URL中显示参数,而POST的数据则放在了请求体(body),所以更安全。


然而安全性的说法存在着两个问题:

  1. 抓包后POST请求也是能看到请求体(body)中的数据
  2. HTTP规范并未规定说 GET 就不能在请求体(body)中传输数据

浏览器由于规范问题不会在GET的请求体中添加数据,但是可以通过例如Fiddler的Composer来添加数据到GET的请求体种。

  1. 数据量的角度

常见的GET和POST区别还有GET传输的数据比较少,POST传输数据多;

  • 这是由于浏览器和服务器均对URL的长度进行了限制,因此表现出了GET传输数据少(一般最多2048B)的缺点。
  • 而对于POST请求,由于数据放在请求体中,虽然理论上不会受到限制,但是实际开发中各个服务器也会对POST的数据大小进行一定的限制;比如nginx默认上传图片的大小是2mb,图片超过2mb就会提示413 Request Entity Too Large。

因此不管GET还是POST,数据传输大小都会有限制,只是POST的传输大小相对于GET来说比较大;数据量大小也并不是面试官期望听到的回答。

  1. 缓存角度
  • GET请求多是用来获取数据的,通常可以缓存。

  • 而POST请求多是用于将表单数据提交到服务端,比如修改姓名、修改密码等操作,需要浏览器必须发送请求到达服务器才能进行操作,因此POST请求不能被缓存。


我们同时将GET和POST请求在浏览器中多提交几次,会发现不管多少次提交,POST请求都是200;而GET请求第一次200,后面的请求会304进行缓存下来。

  1. 编码角度
  • GET请求由于请求数据一般都是在URL上,所以GET一般都是URL编码;

  • 而POST请求由于请求参数的多样性,因此有多重编码方式;一般POST请求有application/x-www-form-urlencoded、multipart/form-data和application/json三种传输方式(在HTTP请求报文中的Content-Type中有所体现)。

  1. multipart/form-data一般在上传文件的时候通过html5的FormData新特性来构造上传表单对象会用到这种编码方式
  2. application/x-www-form-urlencoded是Form表单的默认提交方式,这种方式的好处就是浏览器都支持;但是缺点是在请求发送前需要对数据进行序列化处理,以键值对形式,例如:key1=value1&key2=value2的形式发送到服务器;
  3. 如果使用jQuery的ajax方法,它内部已经对JSON格式的数据进行了序列化处理了;而使用axios默认使用application/json进行编码,或者自己通过原生Ajax请求就需要自己进行序列化。

随着JSON规范越来越流行,并且浏览器支持程度比较好,application/json编码也越来越被更多的开发者使用;通过Content-Type告诉服务器主体内容是JSON格式的字符串,服务器端就会进行解析;这样的好处是前端人员不需要关心数据结构的复杂度,只要是标准的JSON格式就能提交成功。

  1. TCP角度

get会产生一个TCP数据包,POST会产生两个TCP数据包。

  • get会发送http header和data给服务端,服务端返回一个200,请求成功。
  • post会先发送http header给服务端,告诉服务端等一下会有数据过来,服务端返回100,告诉客户端我已经准备接收数据,post在发送一个data给服务端,服务端返回200,请求成功。
  1. 幂等性角度

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方法的区别的主要内容,如果未能解决你的问题,请参考以下文章

html中get和post的区别和使用

html中get和post的区别和使用是啥?

HTTP协议六种请求方法,get,head,put,delete,post有什么区别

get和post两种请求的区别

get与post请求的区别

GET 和 POST 的区别 以及为什么 GET请求 比 POST请求 更快