HTTP中GET和POST详细理解

HTTP中GET和POST

简单来说

GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)

POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。

详细来说
  1. 定义与用途

    • GET 方法:

      • 定义:GET 方法用于从服务器获取资源。它是幂等的,这意味着对同一资源进行多次相同的 GET 请求,应该返回相同的结果,不会对服务器资源产生额外的影响(除了可能的日志记录等无实质影响的操作)。

      • 用途:通常用于查询操作,如获取网页内容、查询数据列表、获取单个数据项的详细信息等。例如,在浏览器中输入一个网址访问网页,浏览器发送的就是 GET 请求来获取网页的 HTML 文件。再如,通过 API 查询用户信息,GET /api/users/123 可以获取用户 ID 为 123 的用户详细信息。

    • POST 方法:

      • 定义:POST 方法用于向服务器提交数据,通常会导致服务器状态的改变。它不是幂等的,多次相同的 POST 请求可能会在服务器端产生不同的结果,因为每次请求都会提交新的数据并可能改变服务器资源的状态。

      • 用途:广泛用于创建或更新资源。比如,在用户注册功能中,通过 POST 方法将用户填写的注册信息(如用户名、密码、邮箱等)发送到服务器,服务器接收并创建新的用户记录;在更新用户信息时,也可以使用 POST 方法将修改后的用户数据发送给服务器,服务器根据提交的数据更新用户记录。

  2. 请求参数传递方式

    • GET 方法:

      • 参数位置:请求参数会附加在 URL 之后,通过 “?” 符号与 URL 路径分隔,多个参数之间用 “&” 符号连接。例如,https://example.com/api/search?keyword=java&page=1,其中 “keyword=java” 和 “page=1” 就是请求参数,这种方式称为查询字符串(Query String)。

      • 数据可见性:由于参数直接暴露在 URL 中,所以数据是可见的,这在某些情况下可能会带来安全风险,如包含敏感信息(如密码)的参数不适合用 GET 方法传递。同时,由于 URL 长度有限制(不同浏览器和服务器对 URL 长度限制不同),所以 GET 方法传递的数据量也受到一定限制。

    • POST 方法:

      • 参数位置:请求参数通常包含在请求体(Request Body)中。请求体的格式可以有多种,如常见的application/x - www - form - urlencoded(类似于 GET 方法的查询字符串格式,但在请求体中)和multipart/form - data(用于上传文件等复杂数据格式)。

      • 数据可见性:数据在请求体中,对于普通用户来说是不可见的,相对 GET 方法更安全一些,并且在数据量上没有像 GET 方法那样严格的 URL 长度限制,理论上可以传递大量的数据,不过实际情况还会受到服务器配置等因素的限制。

  3. 缓存特性

    • GET 方法:

      • 缓存适用性:由于 GET 方法主要用于获取资源,所以比较适合缓存。浏览器和一些中间代理服务器可以根据请求的 URL 缓存 GET 请求的响应结果,当再次发起相同的 GET 请求时,如果缓存未过期,就可以直接从缓存中获取响应,而无需再次向服务器发送请求,提高了访问速度和性能。

      • 缓存控制机制:服务器可以通过设置缓存相关的头信息(如Cache - ControlExpires等)来控制 GET 请求响应的缓存时间和缓存条件。例如,Cache - Control: max - age = 3600 表示该资源可以在客户端缓存 1 小时(3600 秒)。

    • POST 方法:

      • 缓存适用性:POST 方法一般不被缓存,因为每次 POST 请求都可能导致服务器资源状态的改变,缓存 POST 请求的响应可能会导致数据不一致等问题。不过,在一些特殊情况下,经过谨慎考虑和特殊配置,也可以对 POST 请求的响应进行缓存,但这种情况比较少见。

      • 缓存控制机制:通常情况下,服务器会设置合适的头信息来指示不要缓存 POST 请求的响应,如Cache - Control: no - cache

  4. 安全性方面

    • GET 方法:

      • 安全风险点:如前面提到的,由于请求参数暴露在 URL 中,存在安全风险。如果包含敏感信息(如密码、认证令牌等),这些信息可能会被记录在浏览器历史记录、服务器日志或者网络传输过程中的中间设备(如代理服务器)上,容易被窃取。此外,由于可以通过 URL 直接构造请求,也容易受到跨站请求伪造(CSRF)攻击。

      • 安全防护措施:对于敏感信息,尽量避免使用 GET 方法传递;在防止 CSRF 攻击方面,可以采用添加随机令牌(Token)等措施,如在 HTML 表单中添加一个隐藏的csrf_token 字段,在服务器端验证该字段的值来确保请求的合法性。

    • POST 方法:

      • 安全风险点:虽然 POST 方法的数据在请求体中相对安全一些,但如果没有采取适当的安全措施,如加密传输(使用 HTTPS),数据在传输过程中仍然可能被窃取。另外,POST 请求也可能会受到一些攻击,如 SQL 注入(如果服务器端对输入数据处理不当,攻击者可以通过在 POST 数据中注入 SQL 语句来破坏数据库)、跨站脚本攻击(XSS,如果没有对 POST 数据进行合适的过滤和验证,可能会导致恶意脚本在客户端执行)等。

      • 安全防护措施:采用 HTTPS 加密传输来保障数据在传输过程中的安全性;在服务器端对 POST 数据进行严格的输入验证、过滤和消毒处理,防止 SQL 注入和 XSS 等攻击。例如,对用户输入的内容进行转义处理,确保输入的内容不会被误解为 SQL 命令或者脚本代码。

GET 和 POST 方法都是安全和幂等的吗?

先说明下安全和幂等的概念:

  • 在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。

  • 所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。

如果从 RFC 规范定义的语义来看:

  • GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签

  • POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签

小结。

GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。

POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。

但是实际过程中,开发者不一定会按照 RFC 规范定义的语义来实现 GET 和 POST 方法。比如:

  • 可以用 GET 方法实现新增或删除数据的请求,这样实现的 GET 方法自然就不是安全和幂等。

  • 可以用 POST 方法实现查询数据的请求,这样实现的 POST 方法自然就是安全和幂等。

HTTP 传输的内容都是明文的,虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了

所以,要避免传输过程中数据被窃取,就要使用 HTTPS 协议,这样所有 HTTP 的数据都会被加密传输。

GET 请求可以带 body 吗?

RFC 规范并没有规定 GET 请求不能带 body 的。理论上,任何请求都可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。

另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的。

参考:

小林coding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/36343.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了,也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科: 事务(Transaction),一般是…

MySQL 服务无法启动

常见原因: 检查端口占用: 使用命令行工具(如netstat)来检查3306端口是否已被其他程序占用,输入netstat -ano(Windows)或netstat -tulnp | grep 3306(Linux/Mac)来查找3306端口的占用情况。如果…

基于Node.js的后端服务基础模块及应用

使用generator-express-no-stress-typescript脚手架工具创建一个图片上传服务的模板工程,执行如下指令: npm config set registry https://registry.npmmirror.com yo express-no-stress-typescript uploadService 可以看到后端框架如下: 先…

Hadoop生态圈框架部署 伪集群版(八)- Sqoop安装与配置

文章目录 前言一、Sqoop安装与配置(手动安装配置)1. 下载Sqoop2. 解压Sqoop安装包2.1 解压2.2 重命名 3. 配置Sqoop3.1 配置Sqoop环境变量3.2 修改 sqoop-env.sh 配置文件3.3 配置jar包3.3.1 配置MySQL驱动jar包3.3.2 配置commons-lang-2.6.jar包 4. 测试…

视频编辑技术:一键生成混剪视频的AI技术应用

随着视频内容的爆炸式增长,视频编辑技术也在不断进步。本文将探讨如何利用AI技术,实现一键生成混剪视频,并自动添加配音和字幕,以提高视频编辑的效率和质量。 AI技术在视频编辑中的应用 AI技术在视频编辑领域的应用越来越广泛&am…

笔记本外接显示屏没声音

1、笔记本正常有声音,但是外接显示屏后没有声音了怎么回事呢?原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出,但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法:打开笔记本设置,选择声…

Linux其二设置端口号,静态ip以及命令

目录 1、VI编辑器 【linux版本的文本文件】 2) 补充的vi编辑器的其他内容(了解) 2、ln 连接的意思 link的缩写 3、文件的查看 【重点】 4、压缩与解压(重点) 5、find 查找命令 6、which & whereis 作用是一样的,表示某…

飞飞5.4游戏源码(客户端+服务端+工具完整源代码+5.3fix+5.4patch+数据库可编译进游戏)

飞飞5.4游戏源码(客户端服务端工具完整源代码5.3fix5.4patch数据库可编译进游戏) 下载地址: 通过网盘分享的文件:【源码】飞飞5.4游戏源码(客户端服务端工具完整源代码5.3fix5.4patch数据库可编译进游戏) 链…

【Linux】进程间通信 -- System V 消息队列

前言 上节Linux学习,我们学习了System V的共享内存,本节我们学习System V 的另一种通信方式 — 消息队列 文章目录 前言一. 消息队列的原理二.创建消息队列二. 查看消息队列三. 删除消息队列四. 读写数据结束语 一. 消息队列的原理 消息队列的本质同共享…

Elasticsearch入门之HTTP基础操作

RESTful REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在…

4.模块化技术之子程序

总学习目录请点击下面连接 SAP ABAP开发从0到入职,冷冬备战-CSDN博客 目录 ​编辑 1.模块化基础和概述 使用模块化有什么好处 两大类模块化技术 程序局部的模块化 SAP系统内全局模块化 封装有什么好处? 2.子程序模块化 三种传递类型 子程序结构…

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序,此时需要接触到IAP编程。 IAP即为In Application Programming,解释为在应用中编程,用户自己的程…

网上图书购物管理系统|Java|SSM|VUE| 前后端分离

【一】可以提供远程部署安装,包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、M…

Python酷库之旅-第三方库Pandas(264)

目录 一、用法精讲 1251、pandas.tseries.offsets.WeekOfMonth.is_year_end方法 1251-1、语法 1251-2、参数 1251-3、功能 1251-4、返回值 1251-5、说明 1251-6、用法 1251-6-1、数据准备 1251-6-2、代码示例 1251-6-3、结果输出 1252、pandas.tseries.offsets.Las…

“为您的家电穿上防震铠甲:优质电器缓冲器

在地震频发地区或日常生活中,确保家电的安全和稳定至关重要。为了防止地震、意外碰撞或其他外力对家电造成损害,采用优质的电器缓冲器就像是为家电穿上了一层坚固的“防震铠甲”。这不仅能够有效减少因震动导致的损坏风险,还能显著延长家电的…

全连接层与链式求导法则在神经网络中的应用

目录 ​编辑 引言 全连接层的工作原理 前向传播 反向传播 链式求导法则及其在神经网络中的应用 链式求导法则 应用于全连接层 计算梯度 结论 引言 在深度学习领域,全连接层(Fully Connected Layer,FC)和链式求导法则是…

基于框架的逻辑回归:原理、实现与应用

目录 ​编辑 逻辑回归原理 损失函数与优化 正则化 基于框架的实现 1. 数据预处理 2. 模型初始化与训练 3. 模型评估与调优 4. 特征缩放 逻辑回归的应用 信用评分 医疗诊断 垃圾邮件识别 推荐系统 结论 在机器学习领域,逻辑回归是一种基础且强大的分类…

【SpringBoot】Day11-10 yml文件配置

三种配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置,那其实呢,在springboot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件&#x…

强化学习新突破:情节记忆与奖励机制引领多智能体协作

简介 本推文介绍了韩国科学技术院发表在人工智能顶会ICLR 2024上的论文《Efficient Episodic Memory Utilization of Cooperative Multi-Agent Reinforcement Learning》。该论文提出创新性高效情节记忆利用(Efficient Episodic Memory Utilization,EMU…