以前只会用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)传递参数。
来源:oschina
链接:https://my.oschina.net/u/4312211/blog/4939487