持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
前两天在看代码时,突然之间忘记了 POST 请求和 GET 请求之间的区别了,一时之间不知道什么情况用 POST,什么时候用 GET.....可能之前本来写的接口就没多少,还基本都是 POST,所以一时懵了,现在赶紧回忆一下....
Http 协议
要想了解 GET 和 POST 请求,就要先了解 Http 协议,因为 GET、POST 就是 Http 协议中的两种发送请求的方法。
Http 协议是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。有如下特点:
- 基于 TCP/IP、一种网络应用层协议、超文本传输协议 HyperText Transfer Protocol
- 工作方式:客户端请求服务端应答的模式
- 快速:无状态连接
- 灵活:可以传输任意对象,对象类型由Content-Type标记
- 客户端请求request消息包括以下格式:请求行 (request line)、请求头部 (header)、空行、请求数据
GET、POST 区别
- 请求缓存:GET 会被缓存,而 POST 不会
- 收藏书签:GET 可以,而 POST 不能
- 保留浏览器历史记录:GET 可以,而 POST 不能
- 用处:GET 常用于取回数据,POST 用于提交数据
- 安全性:POST 比 GET 安全
- 请求参数:querystring 是 url 的一部分 GET、POST 都可以带上。 GET 的 querystring (仅支持urlencode编码),POST 的参数是放在 body (支持多种编码)
- 请求参数长度限制:GET 请求长度最多 1024kb,POST 对请求数据没有限制
针对上述区别存在的误区
“用处:GET 常用于取回数据,POST 用于提交数据”
虽然 GET 替换 POST 来优化网站性能这种说法没错,的确 GET 常被用于取回数据,但是 POST 也被一些 ui 框架使用于取回数据,比如 kendo ui 中的 grid,就是用 POST 来接受数据的。所以结论是 GET、POST 用途也是因地制宜。如果你有使用过 kendo UI,会发现分页、过滤、自定义的参数都包含在 form data 里面。
请求参数
GET 是 querystring(仅支持 urlencode 编码),POST 是放在 body (支持多种编码)
query 参数是 URL 的一部分,而 GET、POST 等是请求方法的一种,不管是哪种请求方法,都必须有 URL,而 URL 的 query 是可选的,可有可无。
“请求参数长度限制:GET 请求长度最多 1024kb,POST 对请求数据没有限制”
GET 方法提交的 url 参数数据大小没有限制,在 Http 协议中没有对 url 长度进行限制 (不仅仅是 querystring 的长度),这个限制是特定的浏览器及服务器对他的限制。
各种浏览器和服务器的最大处理能力:
- IE 浏览器对 URL 的最大限制为 2083 个字符
- Firefox (Browser):对于 Firefox 浏览器 URL 的长度限制为 65,536 个字符。
- Safari (Browser):URL 最大长度限制为 80,000 个字符。
- Opera (Browser):URL 最大长度限制为 190,000 个字符。
- Google (chrome):URL 最大长度限制为 8182 个字符。
- Apache (Server):能接受最大 URL 长度为 8,192 个字符。
- Microsoft Internet Information Server (IIS):能接受最大 URL 的长度为 16,384 个字符。
所以为了符合所有标准,URL 的最好不好超过最低标准的 2083 个字符 (2k+35)。当然在做客户端程序时,URL 并不展示给用户,只是个程序调用,这时长度只收 web 服务器的影响了。对于中文的传递,一个汉字最终编码后的字符长度是 9 个字符。
最常见的 form 表单,浏览器默认的 form 表单,默认的 content-type 是 application/x-www-form-urlencoded,提交的数据会按照 key-value 的方式,jquery 的 ajax 默认的也是这种 content-type。当然在 POST 方式中添加 querystring 一定是可以接收的到,但是在 GET 方式中加 body 参数就不一定能成功接收到了。
“POST 比 GET 安全性要高”
这里的安全是相对性,并不是真正意义上的安全,通过 GET 提交的数据都将显示到 url 上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据,而 POST 不会。另外 GET 提交数据还可能会造成 CSRF 攻击。
“GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包”
不论哪一种浏览器,在发送 POST 的时候都没有带 Expect 头,server 也自然不会发 100 continue。通过抓包发现,尽管会分两次,body 就是紧随在 header 后面发送的,根本不存在“等待服务器响应”这一说。
大致回顾了一下 Http 协议中的 GET、POST 请求之间的区别,许久不用,就会有些生疏了,还是接口写得不够多(doge)....开个玩喜 :)
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!