【HTTP】方法(method)以及 GET 和 POST 的区别

简介: 【HTTP】方法(method)以及 GET 和 POST 的区别

方法(method)

首行中的第一部分。首行是由方法、URL 和版本号组成


方法描述了这次请求想干什么,最主要的是:

  • GET:从服务器拿一个东西过来(读操作)
  • POST:往服务器放一个东西(写操作)
  • 这些方法的语义,都是“标准文档作者”的一厢情愿,仅供参考
  • 但开发者在实际开发程序的时候,才不管这一套。完全可以用 POST 来从服务器拿数据,也完全可以用 GET 往服务器放数据

GET 是很常见的,两个典型使用 POST 的场景:

  1. 登录
  2. 上传

从使用习惯上说,GET 通常没有 body,而 POST 通常有。GET 会把需要给服务器的补充信息放到 query string 中(URL 中),而 POST 会把这些信息放到 body


登录

  • 这里 body 里面放的是 JSON 格式的数据。body 中可以放任意格式的数据,前端和后端约定好即可,JSON 是非常常用的格式
  • 密码是 base64 编码

[!quote] base64 编码

  • 末尾带有“== “,使用四个字节,对原始数据中的三个字节进行重新编码
  • 这种编码方式主要是为了能够去掉原始数据中的二进制内容
  • base64具体的编码规则,有标准版,也有自定义版
  • 标准版,怎么编码、解码都是透明的,无法作为加密的方案
  • 自定义版,自己约定编码规则,别人不知道,此时就可以作为一种简单的加密手段
  • 目前仍然有一部分网站,密码是明文传输(码云去年的时候还是明文传输),黑客稍微抓个包就知道了

上传

Gitee 上更改头像操作


  • body 部分就是图片的内容,图片本身是二进制的,此处是对二进制的图片数据进行了 base64 编码(很长很长的数据)

GET 和 POST 有什么区别(面试)

先盖棺定论:GETPOST 本质上没有区别

  • 使用 GETPOST 的场景可以相互替换(取决于代码是怎么写的,尤其是在服务器和客户端都是自己实现的情况下)
  • 部分服务器/部分浏览器,某些情况下 GETPOST 不能完美替换
  • 但是大部分情况下相互替换问题一般不大

区别

但是 GETPOST 在使用习惯上还是有区别的

  1. GET习惯于把数据放到URLquery string中;POST习惯于把数据放到body
  • GET 也可以把数据放到 body 中。有的服务器/浏览器可能不支持
  • POST 也可以把数据放到 query string 中。对于绝大部分的服务器和浏览器都适用
  1. 语义的区别
  • 标准文档中,GET 的语义是用来获取数据;POST 的语义是给服务器传输数据
  • 实际使用并不一定非得拘泥于上述要求
  1. 关于幂等性
  • 每次输入的内容一定,输出的结果也一定,称为幂等;每次输入的内容一定,输出的结果不一定,就不是幂等
  • 计算机中,幂等也是挺关键的。如果某个操作本身是幂等的,此时就可以进行缓存了
  • 标准文档中,建议 GET 请求实现成幂等的;POST 则无要求

GET 在实际开发中也不一定非得实现成幂等。标准是这么建议的,但不一定采纳。确实很多时候是按照幂等的方式走的

  1. GET 请求是可以被浏览器收藏夹收藏的,而 POST 不可以

不准确的说法

网上有些相关的资料,说法不太准确


  1. POSTGET 更安全

论据: 登录的时候,如果使用 GET,用户名密码就会显示在 URL 上,此时就会被别人直接使用,所以就不安全

论证: 即使是 POST,数据没有显示在 URL,也是可以被黑客通过抓包获取的。真正保证安全性的关键在于加密,如果数据加密了,就算放到 URL 上显示,又能怎样呢?

  1. GET 传输的数据量小(存在上限);POST 传输的数据量更大

论据: 描述的是以前,老版本的 IE 浏览器在实现的时候,URL 的长度有限制(历史了)

论证: 实际上 HTTP 标准文档上明确说了,对于 GET URL 的长度不做限制。目前比较长的 URL 也是很常见的

  1. GET 只能携带文本数据;POST 则可以携带二进制数据

这个说法不能说是完全错误,但确实有一定的局限性

URL 通过 query string 来携带数据,query string 是只能包含文本的,但是可以对二进制数据进行 URL encode,之后自然就成了文本了。到了服务器自然进行 URL decode 就能把数据还原成二进制

POST 请求 body 中也经常不是直接携带二进制(可以),也有很多时候是对二进制数据进行 URL encode / / base64 等方式进行转码


相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
977 14
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
221 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9