当前位置: 首页 > news >正文

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

文章目录

  • 方法(method)
  • 登录
  • 上传
  • GET 和 POST 有什么区别(面试)
    • 区别
    • 不准确的说法

方法(method)

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


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

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

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

  1. 登录
  2. 上传

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


登录

image.png

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

[!quote] base64 编码

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

上传

Gitee 上更改头像操作
image.png|464


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

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

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

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

区别

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

  1. GET 习惯于把数据放到 URLquery string 中;POST 习惯于把数据放到 body

    • GET 也可以把数据放到 body 中。有的服务器/浏览器可能不支持
    • POST 也可以把数据放到 query string 中。对于绝大部分的服务器和浏览器都适用
  2. 语义的区别

    • 标准文档中,GET 的语义是用来获取数据;POST 的语义是给服务器传输数据
    • 实际使用并不一定非得拘泥于上述要求
  3. 关于幂等性

    • 每次输入的内容一定,输出的结果也一定,称为幂等;每次输入的内容一定,输出的结果不一定,就不是幂等
    • 计算机中,幂等也是挺关键的。如果某个操作本身是幂等的,此时就可以进行缓存了
    • 标准文档中,建议 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 等方式进行转码

相关文章:

  • 第十章 【后端】商品分类管理微服务(10.10)——Nacos 注册中心
  • SPSS26统计分析笔记——4 方差分析
  • 并网逆变器是如何产生有功和无功电流的?
  • 华为静态路由(route-static)
  • CKF的改进思路,SVDCKF,LSTMCKF,BPCKF,SVMCKF,自适应抗差CKF
  • 用智能码二维码zhinengma.cn做产品说明书
  • MCU自动测量单元采集振弦式应变计测值的过程
  • 速盾:cdn一般多长时间清理下缓存?
  • SpringCloudEureka简介
  • TikTok直播推流不精准该怎么办?跟IP有关系吗?
  • C++ 刷题 使用到的一些有用的容器和函数
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25
  • Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题
  • OpenHarmony标准系统mipi摄像头适配
  • EchartJs报表展示
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • JS题目及答案整理
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • miaov-React 最佳入门
  • STAR法则
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • vue-cli3搭建项目
  • 基于HAProxy的高性能缓存服务器nuster
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 深度学习入门:10门免费线上课程推荐
  • 用jquery写贪吃蛇
  • 用mpvue开发微信小程序
  • 自制字幕遮挡器
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一些不规范的GTID使用场景
  • #每日一题合集#牛客JZ23-JZ33
  • (06)Hive——正则表达式
  • (175)FPGA门控时钟技术
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (day 12)JavaScript学习笔记(数组3)
  • (NSDate) 时间 (time )比较
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (四)Android布局类型(线性布局LinearLayout)
  • (已解决)vscode如何选择python解释器
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Linux整合apache和tomcat构建Web服务器
  • .net core控制台应用程序初识
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)