从使用角度分析GET和POST的差异性 应用场景

坚强是说给别人听的谎言 提交于 2021-02-01 09:19:27

以前只会用GET和POST,但有时候就会傻傻分不清什么时候该用GET,什么时候该用POST,花了一段时间把这两个东西给琢磨了一遍,特此记录一下。

这里着重讲一下GET和POST一些细节。在讲两者传输区别之前,一个需要注意的就是:很多人一提到地址栏的传参方式,就联想到GET,其实不管是GET还是POST都可以通过地址URL传递参数,因为参数属于URL的一部分,服务端只要能获取URL就能获取其中的参数。很多浏览器也对URL传参的大小做了限制,一般是2K字节数,很多服务器最多也只处理64K的URL。

GET请求:

HTTP协议规定GET请求一般是将数据放在http的header部分,由于header本身只是作为一个标识,并不适合传输大量的数据,所以最好只用于传递一些关键参数信息。GET可以被浏览器缓存,很适合一些请求资源应用场景。

 

POST请求:

HTTP协议规定POST请求一般是将数据放在http的body部分。这样不会受到传输数据的大小限制,理论上可以传输极大的数据包。不过POST请求作为不能被浏览器缓存

HTTP对通过body部分传输数据提供很多种(也就是请求头部对应的Content-Type属性),由于太多,就不一一举例了,就拿postman提供的几种方式作说明:

multipart/form-data:以表单的方式上传文件时就是使用的这种方式。

application/x-www-from-urlencoded:以kye/value的键值对格式传递数据,form表单提交文本默认也是使用该种方式。

raw:可以上传任意格式的文本,支持Text、Javascript、JSON、HTML、XML等等

binary:传输二进制数据,可以用于传输文件。

GraphQL:GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时,有兴趣的可以上官网了解下。

 

下面通过几个实例来分析这两种请求的具体用法,用过postman这个工具的同学应该比较熟悉,在postman中不管是GET还是POST都提供三种传递参数的方式。

第一种,使用Params,这种传参方式是将参数放在URL的后面进行传递,也就是将参数放在HTTP的header中。

 

我们可以用get和post的方式请求测试一次,然后使用Fiddler工具抓包看一下请求和响应的数据,如下图,左边是GET请求,右边是POST请求(看不清可以放大一点)。

 

很明显,虽然GET和POST都可以使用地址传递参数,但最好还是遵守HTTP协议来,让两者各司其职比较好。

第二种,将参数存储到header进行传递。

 

这种传参方式和第一种都是讲数据放到header,严格来说没有太大区别。唯一的区别就是第一种是将参数放在了请求头第一行的地址后面,而这种方式是将数据放在请求头的一个单独区域中。我也截了GET和POST两张图可以参考看一下。

 

而且可以看到,不管是GET请求还是POST请求,我服务端用正常的方式来获取参数是没有获取到的,说明这种方式非常规传参,也不建议我们日常开发使用。

 

第三种,将参数存储到HTTP的body中,我是以application/x-www-from-urlencoded的方式传递的参数。

 

这种方式传递的参数并不是存在HTTP的头部,所以可以传递的数据量就要大得多。同样截图如下。

 

从图中可以看到将参数存储到body,服务端并不能通过常规的get的方式来获取GET请求中的数据,但POST的却可以。

综上三种方式,其实也可以得到一个结论:不管从客户端传参的角度来看,还是从服务端对解析请求的支持性来看,GET都更加适合地址传递参数,POST更加适合在请求体(body)传递参数。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!