关注“web秀”,点击右上角的红色按钮,助你展现自我风采!
最近,面试时常常有人询问 get 和 post 的差异,许多人只能简单解释一下。今天,我们将深入探讨这两个方法,确保理解透彻。
要掌握的内容:get 和 post 的区别解析
让我们先来看看标准答案是如何定义这两者的:
get 和 post 的核心区别如下:
get 用于信息的获取,特点是无副作用、幂等性强且支持缓存;而 post 用于修改数据,具有副作用、非幂等性,且不支持缓存。
get 和 post 仅是 http 协议中两种不同的请求方式,http 是基于 tcp/ip 的应用层协议,因此它们使用的是相同的传输层协议,所以在传输上并无区别。
在报文格式上,区别在于方法名的不同,仅此而已:
post 请求的报文第一行如下:post /url http/1.1
get 请求的报文第一行如下:get /url http/1.1
当包含参数时,get 方法将参数放在 url 中,而 post 方法则将参数放在请求体中。例如,如果参数是 name=javanx, age=25:
get 方法的报文示例:
(示例)下面的图例展示了头条获取文章列表的请求
post 方法的报文示例:
(示例)下面的图例展示了头条回复评论的请求
现在我们了解到,两者的本质上使用的是 tcp 连接,没有实质性区别。实际操作中可以不按规范,get 方法可以在 url 中传递参数,而 post 方法也可以在请求体中传递参数,前提是服务端支持。
get 方法的参数写法有固定格式吗?
根据约定,参数应写在 ? 后面,并用 & 分隔。
解析报文时,通过获取 tcp 数据并使用正则等工具提取 header 和 body,从而获得参数。
例如,header 中添加 token 以验证用户登录状态等权限。
这意味着参数的写法可以自定义,只要服务端能够正确解析即可。
get 方法的长度限制是什么?
通常提到浏览器地址栏参数有长度限制,但实际上,http 协议本身对 body 和 url 长度没有规定限制。浏览器和服务器会因性能和安全考虑而对 url 长度进行限制,以防恶意攻击。
post 方法比 get 方法更安全吗?
有人认为 post 更安全,因为数据不会显示在地址栏中。从传输的角度看,http 数据仍是明文传输的,网络节点上的数据包可能被截获。要实现安全传输,必须使用加密,即 https。
要掌握的内容:get 和 post 的区别解析
post 方法会生成两个 tcp 数据包吗?
有文章提到,post 请求会分开发送 header 和 body,先发送 header,服务端返回 100 状态码后再发送 body。实际上,http 协议并未规定 post 请求一定会产生两个 tcp 数据包,测试结果(如在 chrome 中)显示 header 和 body 不会分开发送。这种分开发送的行为是某些浏览器或框架的特性,并非 post 方法的标准行为。