一、在规范上来说:
1.get请求一般是用于获取数据;post请求是用于提交数据
2.get请求的请求参数是放在url上的,长度有限制,一般限制在 2~8K 之间,更加常见的是 1k 以内;post请求数据是放在请求体中的,没有的长度限制
3.get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。
4.get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
5.get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。
6.get请求和post请求都是http请求方式,底层为TCP协议,通常get请求产生一个TCP包(http header和data一起发送),post请求产生两个TCP包(先发送http header服务器响应100,在发送data服务器响应200)
二、不符合规范时
Get请求和Post请求之间的界限变得越来越模糊,get请求也可以使用body携带数据,post请求也可以在url上拼接请求参数,新版postman实测没有问题,但是老版postman中get请求是不可以有body的,2014 年以前的规范中要求 GET 请求如果有 body,则 body 必须被忽略(虽然不一定报错,但 body 会被忽略);现在没有这个限制了。现在不在 GET 中使用 body 的主要还是因为 GET body 是未定义行为,很有可能不被支持。
那么GET和POST的区别和应用是什么?简而言之,就是“安全”和“不安全”的区别。什么是安全?不用承担责任。什么是不安全?可能需要承担责任。举个例子,点击某个链接以同意某个协议,这个请求明显就是不安全的,因为需要承担责任。如果采用GET,就违反了GET应该用于安全请求的规范。因为浏览器可能在你不知情的情况下预加载这个页面(因为是“安全”的GET请求),这样相当于你在不知情的情况下同意了某个协议,这显然是我们不希望看到的。在契约式的设计里,违反契约的行为是会带来严重的后果的。浏览器按照契约预加载了安全的GET请求,但这本身是不安全的,带来的后果自然要由打破契约的人承担(将这个请求设计成GET的人出来挨打)。
之所以强调“安全”,而不是按照常规的说法强调副作用,因为有副作用的请求不代表不安全;举例来说,服务器有一个显示访问人数的功能,这个功能就可以用GET来做。虽然每次访问都会发送改变服务器状态(计数器)的请求,但用户不会因为这个请求承担责任,这个请求是安全的。至于什么GET请求的URL有长度限制(后来事实证明其实没有),什么GET请求的URL里不能有中文(或者说非ASCII吧),都只是实现上的区别;从最初的设计上来说区别并不在这里。
当然,这些都是纯粹的理论层面的东西。如果遵守RESTful的规范,采用语义化的GET/POST请求,自然也就不会有这些问题了。因为通常来说,查询是安全的;这也是GET的主要作用。
参考自链接:关于在GET请求中使用body_get body_元无心的博客-CSDN博客 get请求和post请求的区别(全面讲解)_get与post是推和取__处女座程序员的日常的博客-CSDN博客