深入【Get】与【Post】区别

简介: 深入【Get】与【Post】区别

区别:


GET请求在URL中传送的参数是有长度限制的,而POST没有。


GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。而POST数据不会显示在URL中。是放在Request body中。


对参数的数据类型,GET只接受ASCII字符,而POST没有限制。


GET请求参数会被完整保留在浏览器历史记录里;相反,POST请求参数也不会被浏览器保留。


GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式。


GET请求会被浏览器主动缓存,而POST不会,除非手动设置。


GET在浏览器回退时是无害的,而POST会再次提交请求。


其实吧,GET和POST在本质上没有区别,都是HTTP协议中的两种发送请求的方法。而HTTP呢,是基于TCP/IP的关于数据如何在万维网中如何通信的协议。


万维网:简称WWW,是World Wide Web的简称,也称为Web、3W等。


HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。


GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。


举个例子吧:


TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。


但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。


为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,包括GET, POST, PUT等等,


HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。


如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里(request body中)。

HTTP只是个行为准则,而GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。


URL中传送参数的长度限制在Get和Post中都是怎么样的呢?


不同的浏览器Client端(发起http请求)和服务器server端(接受http请求)就是不同的运输公司。


虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。


业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。


超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略。



那GET 方法参数写法是固定的吗?

在约定中,我们的参数是写在 ? 后面,用 & 分割。如下:


http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2



我们知道,解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。


比如header请求头中添加token,来验证用户是否登录等权限问题。


也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,万变不离其宗。


那么说来,是不是POST 方法比 GET 方法更安全呢?

有人说POST 比 GET 安全,因为数据在地址栏上不可见。


然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。


其实,要想安全传输,就只有加密,也就是 HTTPS。


你知道Get、Post请求发送的数据包有什么不同吗?

GET请求时产生一个TCP数据包;POST请求时产生两个TCP数据包。


GET:浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

POST:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK(返回数据)。


POST需要两步,理论上时间上消耗的要多一点,看起来GET比POST更有效。但并不是,后来发现原来是个坑。在我看来:



GET与POST都有自己的语义,不能随便混用。


据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。


并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。我去年用Chrome浏览器测试发现也是只发送一次,所以我认为Get、POST性能差可以人为忽略。


相关文章
构建安全可靠的系统:第十一章到第十五章
构建安全可靠的系统:第十一章到第十五章
330 0
|
11月前
|
数据采集 缓存 NoSQL
布隆过滤器原理和使用场景
布隆过滤器(Bloom Filter)是一种高效的空间节省型数据结构,用于判断元素是否存在于集合中。它通过多个哈希函数将元素映射到位数组,查询时检查对应位是否全为1。优点是空间效率高,缺点是有一定误判率。典型应用场景包括缓存穿透防护、垃圾邮件过滤、黑名单管理及去重等。Java实现中使用BitSet和自定义哈希函数,而Guava和Redis也提供了布隆过滤器的实现。
547 0
|
算法 Swift 开发者
【Swift开发专栏】Swift开发者的进阶之路:从新手到专家
【4月更文挑战第30天】本文介绍了Swift开发者从基础到专家的成长路径,包括掌握语言基础如语法、数据结构、错误处理和内存管理;深入学习Apple框架如UIKit、Core Data和CloudKit;关注性能优化、架构设计及网络与安全编程;以及持续学习新技术,参与开源项目,建立专业网络。通过不断学习和实践,开发者可逐步成为Swift专家。
451 0
|
人工智能
【MCP教程系列】阿里云百炼xChatPPT,5分钟轻松搞定PPT
通过阿里云百炼平台结合ChatPPT,只需简单四步即可快速生成专业PPT。
3599 0
|
11月前
|
人工智能 NoSQL Java
SpringAI做对了什么
SpringAI 在 AI 编程领域延续了Spring的诸多优势,从易于集成、到通用API设计进行模型切换等。
708 2
SpringAI做对了什么
|
SQL 安全 网络安全
常见网站安全攻击手段及防御方法
【10月更文挑战第18天】随着互联网的发展,网站成为信息和服务的重要渠道,但也成为黑客攻击的目标。本文介绍了几种常见的网站安全攻击手段及其防御方法,包括SQL注入、XSS攻击、CSRF攻击、文件上传漏洞和DDoS攻击。通过使用参数化查询、HTML实体编码、CSRF令牌、文件类型验证和CDN服务等措施,可以有效提升网站安全性,确保其稳定运行。
438 10
|
移动开发 监控 安全
HTML5 WebSocket详解
**WebSocket** 是一种协议,支持浏览器与服务器间的双向全双工通信。不同于传统的 HTTP 模式,WebSocket 建立持久连接,使服务器能主动向客户端推送数据。本文详细解析 WebSocket 的工作原理、优缺点及应用场景,并提供客户端和服务器端的代码示例。WebSocket 适合实时聊天、在线游戏、数据监控等场景,能显著提升用户体验和应用性能,但需注意其实现复杂性和安全性问题。
|
算法 API 数据中心
魔搭社区利用 NVIDIA TensorRT-LLM 加速开源大语言模型推理
魔搭社区于 2022 年 11 月初创建,首次在业界提出了 “模型即服务”( MaaS, Model as a Service)的理念。
|
存储 安全 算法
【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]
【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]
772 1
|
SQL 缓存 关系型数据库
秒杀系统之一致性
秒杀系统之一致性
384 0

热门文章

最新文章