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

网络原理(4):HTTP协议 -- HTTP请求 -- 首行(请求方法)

网络原理(4):HTTP协议 – HTTP请求 – 首行(请求方法)

文章目录

    • 网络原理(4):HTTP协议 -- HTTP请求 -- 首行(请求方法)
  • 观前提醒
  • 1. 认识 “请求”
  • 2. GET 和 POST的使用场景
    • 2.1 GET
      • 示例
        • html
        • CSS
        • JavaScript
      • 总结:
    • 提示:强制刷新操作
      • 解释(浏览器缓存机制):
    • 2.2 POST
      • 登录
      • 上传文件(更换头像)
      • 总结:
  • 3. GET 和 POST的区别(经典面试题)
      • 1. 语义上的区别
      • 2. 携带数据的方式上的区别(重点)
      • 3. GET 请求,通常建议设置为 幂等 的,POST,没有这个要求
        • 什么叫做 “幂等”
          • 举例理解幂等
      • 4. 幂等可缓存,非幂等不可缓存
    • 回答方式:
    • 有待商榷的区别:
      • 1. POST 比 GET 更加安全(安全在于加密)
      • 2. GET 传输数据有长度限制(过时)
      • 3. GET 只能传输文本,POST 可以传输二进制
  • 4. 剩余的 DELETE 和 PUT
    • Restful简介
  • 4. 总结

观前提醒

如果你对 http协议 的基本格式,有所了解的,可以直接看这篇博客,介绍 HTTP请求 – 首行中的 请求方法。

如果你还不懂 http协议 以及 http协议 的基本格式,推荐你看完这篇博客再来看这篇博客:
网络原理(2):TCP/IP五层模型 – 应用层(HTTP协议初识)

同时,关于 HTTP请求 和 HTTP响应,其他常见属性的讲解博客,我编写了一个博客,里面存放着其他常见属性的博客链接:
网络原理(✨✨✨):HTTP协议 – HTTP请求和HTTP响应,常见的属性目录博客
希望你看完这篇博客之后,能点击这个博客链接,再学习其他的常见属性。

在这里插入图片描述
我们这篇博客,讲的是首行中的 请求方法
也就是上面这张图片的:GET

1. 认识 “请求”

HTTP请求 – 首行中的 请求方法,表示的是,这次请求,要干什么。

例如,我们常见的 GET 方法,就表示:这次请求,要从服务器获取一个 XXX 资源

下面是一张表,介绍了请求中,涉及到的方法:
在这里插入图片描述
这张表中的方法,我们主要掌握两个就行:GET 和 POST
往多了说,掌握四个就可以:GET,POST,PUT,DELETE

上述表格的方法,他们的比例可以这么分:
在这里插入图片描述
所以,我们之后,只讲 GET 和 POST 。

GET 和 POST ,是最常见的请求,从语义来说,是 获取和上传
但是,实际开发的时候,是不一定严格按照语义来进行区分的。
程序员实际实现的时候,是可以自行灵活掌握的。

2. GET 和 POST的使用场景

那么,GET 和 POST 这两个方法,经常使用的场景,有这些:

GET:获取资源,例如:获取 html,获取 CSS,获取 JavaScript......
POST:登录,上传文件 ......

2.1 GET

GET 获取资源后,我们如何分辨我们捕捉到的信息?
以 html,CSS,js,为例:
蓝色的记录表示:这个请求,得到了一个网页(html):
在这里插入图片描述
绿色的记录,表示得到了一个 JavaScript:
在这里插入图片描述
紫色的记录,表示得到了一个 CSS:
在这里插入图片描述

示例

使用 搜狗,搜索 NBA 为例:
在这里插入图片描述
我们分别访问一下,这三条记录:

html

在这里插入图片描述

CSS

在这里插入图片描述

JavaScript

在这里插入图片描述

总结:

通过上述抓取到的信息,我们发现,这些请求的方法,都是 GET
可以说明,GET,使用的场景,还是很多的。

如果你仔细观察,会发现:
GET请求有一个共同点:一般是没有 body 的

如果需要通过 GET 给服务器发送一些数据,是通过 Query String(URL 中 ’ ? ’ 后面的,也叫做 查询字符串 ) 传递过去的。

提示:强制刷新操作

如果你发现,你用搜狗,或其他的 搜索 引擎,搜索东西时,Fiddler 抓取的记录,没有 html ,css,js,或者很少。
此时,你可以使用 Ctrl + F5 的操作(笔记本键盘是 Ctrl + Fn + F5 ),或者,按住 Ctrl + 刷新浏览器操作,就能抓取到大量的 html ,css,js 记录了:
在这里插入图片描述

解释(浏览器缓存机制):

使用 F5,是刷新操作,重新访问服务器。
Ctrl + F5 ,是强制刷新

什么是强制刷新?
解释这个之前,我们需要说一说,浏览器的缓存机制。

浏览器,是从 服务器/网络 来加载网页的。
计算机中,按照读写速度,由快到慢,是这么个顺序:
CPU,内存,硬盘,网络

通常情况下,从网络加载数据比从硬盘加载数据,要慢
如果你用的是 万兆 网卡,那当我没说,这个属于是:充值破解版,正常情况下,都是使用的千兆网卡及以下,也就是通常情况。

这个时候,浏览器,为了加快页面的访问速度,就会把页面依赖的一些静态资源(html,css,js,图片,字体,MP3…)这些内容,缓存到电脑硬盘上。

第一次访问那个网站的服务器,需要加载这么多东西,通过浏览器缓存机制,将这些资源,缓存到电脑硬盘上,下次再访问这个网站,就不必重新加载了。
此时加载数据的时候,就是从你的硬盘上,读取这些资源了,加载速度就变快了。

使用 Ctrl + F5 ,强制刷新,它是忽略本地缓存所有资源,重新从服务器获取(GET)
这样就能抓到更丰富的请求结果了。

2.2 POST

POST请求,通常是 登录,或者上传文件的时候,会使用到。

接下来,我就以登录我的 Gitee 账号 和 更换我Gitee账号的头像,为例子。

登录

登录 Gitee 账号:
在这里插入图片描述
点击登录后,Fiddler 抓取的记录信息:
在这里插入图片描述

上传文件(更换头像)

在这里插入图片描述
点击更换之后,Fiddler 抓取到的记录信息:
在这里插入图片描述

总结:

对于 POST,两个经典的场景

  1. 登录
  2. 上传

上传 => 请求带有正文(body)的,正文就是保存了当前上传的数据的内容
我们这个更换头像的请求,图片本身,就是二进制的数据
此处,是通过特殊方式,进行转码(使用 base64 编码),把图片的二进制数据,转化为文本文件

当然,body 也是可以直接填写二进制数据的。取决于程序员,转码与否。

3. GET 和 POST的区别(经典面试题)

GET 和 POST的区别,有四点:

1. 语义上的区别

这个不是特别明显,因为这两个,在实际开发的时候,是可以混着用的。

2. 携带数据的方式上的区别(重点)

这一个区别,一定要牢记!!!

一般来说POST 请求,是带有正文的数据存放在正文(body)当中
同时,POST请求,数据也是可以放在 Query String 的,只不过比较少见

一般来说GET请求,数据是放在 Query String 的
但是,GET请求,理论上,也是可以带 body 的,数据也是可以放在 body 中的,只不过,很少见。

3. GET 请求,通常建议设置为 幂等 的,POST,没有这个要求

“ 通常建议 ”,这个说法,是 HTTP标准文档给的建议。
但是,它仅仅只是建议,并不是强制要求你这么做。

什么叫做 “幂等”

这句话中,还有一个新的名词:幂等

那么,什么叫做幂等?
计算机领域中,是这个意思:
使用相同参数重复执行,并能获得相同结果的函数

请求是一定的,得到的响应,也是一定的,这种情况,就称为幂等

服务器开发中,幂等性,是需要考虑的一个环节。
特别是 支付 的场景,通常都要考虑幂等性

举例理解幂等

举一个简单的例子:
牛吃草,会产奶,今天吃的草,今天挤出来的是牛奶。
也就是,牛吃的是草,重复,每天吃,那么,挤出来的是牛奶,只要吃的是草,得到的产物,就一定是相同的,是牛奶
这个过程,就是幂等的

返例:如果牛吃草,得到的不是奶,而是其他东西,例如: “ 翔 ”,这就不算是一种幂等。

总结就是说,牛都是吃草,产物是牛奶。
吃的东西,是相同的,是草。
得到的东西,也是相同的,是牛奶。
如果有一天,牛吃的是草(参数相同),但是,这次得到的产物不是牛奶了,而是其他的(结果不同了),那么,这就不算是一种幂等了。

再来一个例子:访问 B站
我们访问 B站,每次只需要访问同一个 B站 的链接,或者是点击 B站 的 APP,这是一个相同的请求(相同的参数)。

但是,我们每次访问 B站,首页所展示的视频,是不一样的,可以说,每次所展示的视频,是不一样的(也就是,相同的访问方式,得到的结果,却不是每一次都一样的)。

那么,访问 B站,B站 首页,每次展示的是不同的视频,也就是不同的结果。
这个过程,就不是幂等的

4. 幂等可缓存,非幂等不可缓存

由于第 3 点,说到的,建议 GET 设计成 幂等的。
所以,就有了第四点区别:
GET 设计成幂等,就可以允许 GET 请求的结果被缓存
POST由于不要幂等,所以,POST 一般不是幂等,就认为 POST 请求的结果,是不能被缓存的。

其实,现在的 GET请求 不幂等的请况,太常见了,比如 B站:
我们上面说,B站 不是幂等的,但是,当我们访问 B站 时,请求的方法是 GET。
在这里插入图片描述
为什么现在的 GET请求 不幂等的请况,太常见了?
因为现在的互联网产品,讲究个性化推荐

什么是个性化?
假如你在 B站,经常刷美女的视频,那么,你下次打开 B站 的时候,首页推荐的视频,大多数,都是关于美女的视频,这就是个性化。

回答方式:

如果你面试中,被这样子问到之后,你可以这样回答:

首先,GET 和 POST,这两个请求方法,没有本质上的区别
什么叫做本质上的区别?
就是说:某一个场景下,我只能用 GET,不能用 POST 这种。
所以,这两个请求方法,是能够混着用的

使用方法,习惯上来说,主要是两个方面的区别:

  1. 语义上的区别
  2. 携带数据的方式上的区别

第 3 点和第 4 点,不太明显,但是也可以回答给面试官听。

有待商榷的区别:

除了上面这四个点之外,网上有些资料,对于 GET 和 POST 的说法,是有待商榷的。

接下来,我列举三个。

1. POST 比 GET 更加安全(安全在于加密)

这个主要体现在登录场景

登录的时候,我们要输入用户名和密码。
如果你使用的是 GET请求 的话,用户名和密码,就会放到 URL 的 Query String 中,就会显示在浏览器地址栏上

例如:
https://gitee.com/login?username=zhangsan&password=123456
如果是使用 GET请求,URL 长成这样,是个人看见,都会觉得不安全。

但是,安全不安全,和 URL 长不长成这样,没什么关系!!!

因为,要保证安全的话,关键是要进行 “ 加密传输 ”。

退一步讲,如果你使用的是 POST请求,登录时,用户名和密码放在 正文(body)中,你不能直接在 URL 看到用户名和密码。
但是,使用 POST 传输的话,如果你不进行加密,黑客随便使用个抓包工具,也能看到当前这个 POST请求 的正文中,包含了什么了
所以,只要你的传输不是加密传输,是明文传输的,都谈不上安全这回事

所以,安全的关键,在于传输是否是 “ 加密传输 ” ,和使用哪个请求方法,没什么关系。

2. GET 传输数据有长度限制(过时)

这个说法,来自于上古时期
那时候,IE浏览器的版本,属于是 IE6版本,这个版本,是微软公司于2001年10月25日发布的一款网页浏览器。它是Windows XP操作系统的默认浏览器。

为什么我们这里,只提到 GET 有长度限制,没有提到 POST?
答:
GET 请求,数据一般是放到 URL 的Query String 中的,传输的数据多了,URL 就会很长。
POST 请求,数据一般是放到 Body(正文) 中的,URL 就比较短。

当时,IE6,对于 URL 的长度,是有限制的
如果使用的是 IE6,URL 传输的数据太多,可能就会被截断。
这个时候,是 2001年。

我们回到 2025年,现在的 浏览器/服务器,随着时代技术的发展,早就没有这样的限制了。
现在,比较长的 URL,也是可以见到的。

所以,这个说法,是一个过时的说法。

3. GET 只能传输文本,POST 可以传输二进制

这个说法,不能说它错,但是,也不全对。

由于 GET请求,一般是把数据,放在 URL 的 Query String中的,URL中,确实只能放文本信息
但是,我们可以把 二进制 通过 base64编码 转码成文本的。

而且,并不是所有的 GET请求,数据都放 URL 里面的,有些 GET请求,是可以有 body 的,可以把 除文本 外的数据放到 body 里面。
只不过,这种情况,很少见,有的 客户端/服务器 ,也不支持这样的 GET请求。

4. 剩余的 DELETE 和 PUT

除了一定要掌握的 GET 和 POST 之外,我们还可以掌握另外两个:DELETE 、PUT

这两个方法,在实现 Restful 风格的 api 的时候,会用到。
API,也叫应用程序接口。

Restful简介

什么叫 Restful 风格的 api?
这是 设计服务器接口 的一种 “习惯”

进行开发的时候,做的最多的事情就是 “ 增删改查 ”。
按照 Restful 风格 :
新增:POST
删除:DELETE
修改:PUT
查询:GET

这是一种 设计服务器接口,比较流行的一种风格。

Restful,不光规定了方法,还规定了请求路径,路径该怎么组织… …
这是一系列的规范,约定。

它具体的体现,在你学习完 SpringMVC 的时候,会提及到的。

目前,你只需要了解一下,有这个 Restful api设计风格 就可以,等你学到 Spring框架的时候,会涉及到的。
这里就不再展开说了,展开来说,东西太多了,三言两语讲不清楚。

4. 总结

这篇博客,我们主要讲解:

  1. 请求中的方法,表示的含义
  2. GET 和 POST 方法的使用场景
  3. GET 和 POST 的区别(经典面试题)
  4. Restful api设计风格简介

HTTP请求 和 HTTP响应,其他常见属性的讲解博客,我编写了一个博客,里面存放着其他常见属性的博客链接:
网络原理(✨✨✨):HTTP协议 – HTTP请求和HTTP响应,常见的属性目录博客
希望你看完这篇博客之后,能点击这个博客链接,再学习其他的常见属性。

最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!

http://www.dtcms.com/a/390001.html

相关文章:

  • 密钥下发服务中心:双重验证 + 实时监控的轻量级密钥管理解决方案
  • 硬件 - RK3588部分(4) - 原理图 - RK806
  • Sass开发【三】
  • 百度之星2025(第二场)
  • Ovis-U1:阿里巴巴推出的统一的多模态理解与生成模型
  • 深入剖析C++智能指针:unique_ptr与shared_ptr的资源管理哲学
  • 创建索引失败,表一直查询不了
  • 知识分享:网线和DB9正确接线方法
  • 【算法笔记】前缀树
  • 让ai完成原神调酒 试做
  • 第十四届蓝桥杯青少组C++选拔赛[2022.11.27]第二部分编程题(2、拼写单词)
  • 私有化部署UE像素流后,通过实时云渲染平台配置网络端口,实现云推流内网及公网访问
  • Day 05 Geant4多线程 Multithreading --------以B1为例
  • 【word解析】从 Word 提取数学公式并渲染到 Web 页面的完整指南
  • FreeRTOS 队列机制详解:阻塞、唤醒与任务同步
  • Unity学习之UI优化总结
  • 基于微信小程序蓝牙信标 (Beacon)的室内导航实例
  • 用Comate Zulu开发一款微信小程序
  • 触觉智能Purple Pi OH2开发板配置参数
  • 鸿蒙Next应用文件管理全攻略:从基础操作到高级实践
  • 云手机对《黑神话:悟空》的作用都有哪些?
  • Leetcode 994. 腐烂的橘子 多源 BFS
  • 微硕WSP4982双N沟MOSFET,赋能汽车智能座椅通风系统
  • BMP280 气压计驱动
  • 速通ACM省铜第八天 赋源码(1709)
  • InnoDB索引结构与排序构建机制详解
  • mmpose可视化出错,图像与关键点对不上
  • Flutter 基本开发环境配置环境搭建
  • 【数控系统】第七章 NURBS插补
  • 某养老数字化协同办公平台网络方案解析