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

以前只会用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属性),由于太多,就不一一举例了(有兴趣的可以去这里查阅参考:https://www.runoob.com/http/http-content-type.html),就拿postman提供的几种方式作说明:

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

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

raw:可以上传任意格式的文本(postman中可以在右侧下拉菜单手动选择),支持TextJavascriptJSONHTMLXML等等,比如选择JSON的话,对应的就是Content-Type: application/json

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)传递参数。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值