前言
要想回答好这个问题,咱们先来了解以下什么是GET、POST方法,有哪些细节要注意;
一、什么是GET、POST?
1.1GET
GET是HTTP请求最常用的方法,本质上就是浏览器通过GET方法,向服务器发起GET请求,从服务器拿到相应的数据;
什么时候会触发这个请求?
1.浏览器的地址栏中输入URL,就会触发GET;
2.HTML里的link、a、img、script会触发GET请求;
3.html中的form标签可以构造出GET请求;
4.使用 JavaScript 的 ajax 也可以构造 POST 请求
很多人的误区:“GET请求长度长度最多是1KB / 2KB ...?”;这个说法真的正确吗?
HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明: "Hypertext Transfer Protocol -- HTTP/1.1," does not specify any requirement for URL length.
也就是说,标准中,并未对URL的长度做出限制;其实虽然没有提到有长度上限,但是浏览器和HTTP服务器在实现的时候,可能有长度上线,也可能没有,具体要看如何实现了;
1.2POST
POST是用来将用户输入的数据发送给服务器的一种方法;(例如一些网站的登录界面,当你输入账号和密码,提交以后,便会执行这个方法);
什么时候会触发这个请求?
1.通过 HTML 中的 form 标签可以构造 POST 请求
2.使用 JavaScript 的 ajax 也可以构造 POST 请求
POST请求的特点
1.POST请求中,首行第一部分为POST;
2.URL一般没有query string;
3.header 部分有若干个键值对结构.
4.body部分的数据格式有很多种,一般不会为空;
二、如何轻松回答?
第一步、直接盖棺定论:
GET和POST没有本质区别,使用GET的场景基本都可以使用POST代替,使用POST的场景也可以用GET代替;
第二步、谈细节上的区别:
细节一:(语义上)
GET语义:从服务器获取一个数据;
POST语义:往服务器提交一个数据;
虽然HTTP协议说是这么说,但是很多程序员还是没有遵守这个约定~
细节二:(使用习惯上)
习惯上,给服务器传递数据,GET通常放在URL的query string中,POST通常是放在body;中;
GET能放在body中吗?可以滴,HTTP客户端支持,但是浏览器不一定支持;
POST能放在query string中吗?可以呢!浏览器和客户端都支持~
细节三:(幂等)
GET请求建议实现成“幂等”的,POST不做要求;(幂等性:比方说一个函数的方法是1 + 1,结果等于2,你调用一次结果是2,你调用n次结果依然是2,不会改变);
服务器设计时会提供一些api:api传入的参数视为输入,返回的结果视为输出;基于GET的api建议设置成幂等的,POST不做要求;
细节四:(缓存)
在幂等的基础上,GET请求结果是可以被缓存的,POST一般不缓存;
这时浏览器默认的,若当前GET时幂等的,就不做处理,让浏览器缓存;若当前GET不是幂等的,就需要通过特殊技避免产生缓存;(技巧就是让GET请求的URL都不同,通过特殊的query string保证URL不同);
细节五:(数据长度限制)
由于 GET 请求一般放在 URL 中,因此请求的数据长度受到限制,安全 URL 长度限制通常为 2048 个字符,最多可传输 2KB 的数据,但因浏览器和 Web 服务器而异。
POST 请求无限制。
POST比GET更安全,这个说法正确吗?
虽然在登录界面GET把参数放到的URL中确实不好,但是放到POST的body中,也一样没有更安全;因为咱们平时谈到的是否安全,是指:你的数据被黑客截获后,会不会对你造成信息泄漏这样的影响,只要你的代码没有进行加密,就谈不上安全;