2023.9.23 关于 HTTP 详解

news2024/11/24 1:05:38

目录

HTTP 协议

认识 URL

HTTP 请求

  认识方法 

HTTP 响应

认识状态码  

 总结

HTTP 请求的构造 

Form 表单构造

AJAX 构造

Postman 构造


HTTP 协议

  • 应用层使用最广泛的协议
  • 浏览器 基于 HTTP协议 获取网站
  • 是 浏览器 和 服务器 之间的交互桥梁
  • HTTP协议 基于传输层的 TCP协议 实现
  • HTTP 全称为 HyperText Transfer Protocol,中文翻译为 超文本传输,意思是不仅能传输文本,还可传输图片、视频、音频等二进制数据

认识 URL

  • 绿色部分:指 协议方案名
  • 青色部分:指 服务器地址、域名,通过 DNS 可转化为 IP 地址
  • 黄色部分:指 服务器端口号,描述的是哪个程序
  • 橙色部分:指 带层次的文件路径,找到程序管辖下的哪个文件
  • 蓝色部分:指 查询字符串(query string,获取资源时候所带的参数
  • 紫色部分:指 片段标识符

注意:

  • 一个 URL 其中有些部分可以省略

  • 当端口被省略时,浏览器提供默认端口
  • HTTP协议 默认端口为 80,HTTPS协议默认端口为 443
  • 当然这里的 带层次的文件路径 并未省略,/ 也是路径,为 HTTP 服务器的 根目录
  • HTTP服务器 是系统上的一个进程,通常委托该 服务器 管理系统上的一个特定的目录,同时在这个目录里的资源都可以让外面进行访问
  • 当然所管理的 根目录 可以为系统上的任意一个目录,具体看服务器的配置
  • 不同路径 拿到的网页资源是不同的

补充:

  • 当我们在百度搜索框中输入你好

图一:浏览器 URL 框中所显示的 URL

图二:复制浏览器 URL 框中的 URL ,并粘贴到记事本中所显示的 URL

  • 注意这两个 URL 实际是一样的,唯一的不同是中文 "你好" 变成了一串有规律的字符码 
  •  %E4%BD%A0%E5%A5%BD   称为 urlencode(转义字符),将中文 "你好" 重新转译为 % + 16进制数,如果此处不进行编码,直接写中文,浏览器可能就无法正确识别,从而访问出错!
  • urlencode 为编码工具,就有与之对应的 urldecode 解码工具 
  • 通常 urlencode 和 urldecode 都是 浏览器 或 HTTP 服务器内置的行为,一般写代码不会涉及,仅需知道该概念即可

阅读下面内容之前,我们需要了解并熟悉 Fiddle 工具的使用,可点击下方链接阅读

Fiddle 安装使用


HTTP 请求


1.首行

  • 红框代表 HTTP 的方法
  • 篮框代表 URL,唯一资源定位符,标识互联网上唯一的资源的位置(资源在服务器的哪个目录下的哪个文件)
  • 绿框代表 HTTP 的版本号

2.请求头 header

  • 按 行 组织的键值对,每一行均为一个键值对,键和值之间使用 :和 空格 来分割
  • 每个 键和值 均有固定含义,均为 HTTP协议 定义好的

Host

  • 描述服务器所在的地址和端口

Content-Length

  • 表示 body 中的数据长度

Content-Type

  • 表示请求的 body 中的数据格式

User-Agent

  • 描述 操作系统 和 浏览器 的版本,现今主要用来区分 PC端 和 移动端,并返回不同的页面

Referer

  • 描述 当前页面 是从 哪个页面 跳转来的
  • 通过 地址栏输入地址 或 直接点击收藏夹 是没有 Referer 的
  • 本质是 浏览器 给网页提供的 本地存储数据 的机制
  • Cookie 通过 键值对 的方式来组织数据
  • 为了保证安全,网页 默认不允许访问 主机硬盘
  • 但 Cookie 对 浏览器 访问 硬盘 做出了明确的限制,仅能访问限制区域
  • 服务器会通过 HTTP响应 报头部分(Set-Cookie 字段),让浏览器的 Cookie 进行相应存储,所以 Cookie 中的数据来自于服务器
  • Cookie 存储在浏览器中,其实就是存储在硬盘中
  • Cookie 在存储时,按照 浏览器 + 域名 的形式进行细分的
  • 不同的浏览器,各自存储自己的 Cookie,同一浏览器不同域名,也对应着不同的 Cookie
  • Cookie 一般还有过期时间,意味着 Cookie 到达 过期时间 ,浏览器便会自动删除 Cookie,所以 Cookie 并不是永久存储在硬盘中
  • 客户端通过 Cookie 来保存当前 服务器和客户端 交互的中间状态
  • 当客户端访问浏览器的时候,会自动将 Cookie 内容带入到请求中,从而服务器便能知道当前客户端的具体情况,因为一台服务器是为多个客户端提供服务!

3.空白行

  • 首图红框部分即为空白行
  • HTTP协议 并未规定报头部分的键值对的数量,从而空白行便为 报头(header) 的结束标记,即 报头 和 正文 之间的分隔符
  • HTTP 在传输层依赖 TCP 协议,而 TCP 又是面向字节流的,如果无 空白行,便会出现经典的 粘包问题

4.正文 body

  • 不是每个请求均有正文部分
  • 正文存放数据的内容和格式一般由程序员自主定义

  认识方法 

  •  方法描述了 HTTP请求 的语义

  • 在实际的开发中 GET 和 POST 是最常见的两个方法

GET 请求常见的几种形式:

  • 在浏览器地址栏直接输入 URL 访问
  • HTML 中的 link、script、img、a 等标签
  • 通过 JavaScript 构造 GET 请求

POST 请求常见几种形式:

  • 登录操作
  • 上传文件操作

注意:

  • GET 请求无正文 body,POST 请求一般有正文 body
  • 上图的各方法说明是 HTTP设计者的设计初心,但在实际开发中,这些说明仅供参考

GET 和 POST 典型区别:

  • GET 和 POST 没有本质区别,大部分场景下都能相互代替,但是在使用习惯上差异相对较大
  • GET 进行信息的传递一般放在 query string 中,POST 传递信息一般通过 正文 body
  • GET 请求一般是从服务器获取数据,POST 请求一般是用于给服务器提交数据
  • GET 可以被缓存,POST 一般不能缓存(把请求的结果保存下来,下次请求则不需要真请求,直接读取缓存结果就行)
  • GET 一般会被设计成幂等, POST 不要求幂等 

HTTP 响应

 


1.首行

  • 红框代表 HTTP 的版本号
  • 绿框为状态码

2.响应报头 header

  • 键值对结构

3.空白行

  • 首图红框部分即为空白行
  • HTTP协议 并未规定报头部分的键值对的数量,从而空白行便为 报头(header) 的结束标记,即 报头 和 正文 之间的分隔符
  • HTTP 在传输层依赖 TCP 协议,而 TCP 又是面向字节流的,如果无 空白行,便会出现经典的 粘包问题

4.正文

  • 正文可为 json 数据、HTML、CSS、JavaScript、图片 等等
  • 此处正文为 json 数据

认识状态码  

  • 状态码描述了 HTTP响应 的结果
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器请求出错
  • 以下列举几种常见的状态码

200 OK

  • 最常见的一个状态码,表示访问成功

404 Not Found

  • 表示没有找到资源
  • 当输入 URL 访问对方资源服务器上相应资源时,如果该 URL 标识的资源不存在,便出现 404

403 Forbidden

  • 表示访问被拒绝
  • 有些页面通常需要用户有一定权限才能访问,如 用户仅在登录后才能访问的页面 ,如果用户未登录,直接访问该页面,则会出现 403

405 Method Not Allowed

  • 表示对方服务器不支持该方法
  • 如对方服务器仅支持 GET 、POST 方法,其余 PUT、DELETE 等方法不支持,如果使用这些不支持的 HTTP请求方法 来请求服务器,则出现 405

500 Internal Server Error

  • 表示服务器内部出现错误
  • 一般是服务器内部代码执行出现错误、一些异常情况(服务器异常崩溃),便会出现 500

504 Gateway Timeout

  • 表示扮演网关或代理的服务器无法在规定时间内获得想要的响应
  • 当服务器负载比较大的时候,服务器处理单条请求的时候消耗的时间就会很长,便可能会导致出现超时的情况,便会出现 504
  • Gateway 代表网关,就是一个网络的入口或出口,通常代指一个机房的入口服务器
  • 一般 192.168.1.1 这种 IP 为网关 IP

302 Move temporarily

  • 表示临时重定向
  • 在登录页面经常见到 302 ,用于实现登录功能后自动跳转到主页,响应报文的 header 部分会包含一个 Location 字段,表示要跳转到哪个页面

301 Move Permanently

  • 表示永久重定向
  • 当浏览器收到该 HTTP响应状态码,后续的请求都会被自动改为新地址
  • 通过 Location 字段来表示要重定向到新的地址

 总结

 HTTP协议中程序员可自定义:

  • URL 中的路径
  • URL 中的 query string
  • header中的键值对
  • header中的 cookie的键值对
  • 正文 body 

HTTP 请求的构造 

Form 表单构造

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 表单标签 允许用户和服务器之间交互数据 -->
    <form action="https://www.baidu.com" method="get">
        <input type="text" name="studentName">
        <!-- input type="submit" 构造了一个特殊的 提交按钮 value 属性描述了按钮中的文本 -->
        
        <!-- 点击这个按钮就会触发 form 表单的 提交操作 也就是构造 HTTP 请求发送给服务器 -->
        <input type="submit" value="提交">
    </form>
</body>
</html>

页面操作

  • 我们使用 Fiddle 将我们构造的请求进行抓包

  • 根据上图我们可以清楚的看到,通过 Form 表单 能构造一个 GET 请求
  • 当然我们也可以通过 Form  表单构造一个 POST 请求

注意:

  • studentName = lisi 这一键值对,GET 请求将其放在 query string 中,而 POST 请求将其放在 正文 body 中,能很好的对应上文讲述的 GET 和 POST 的区别
  • Form 标签仅能构造 GET 和 POST 请求 ,无法构造 PUT、DELETE 等请求

AJAX 构造

  • 全称 Asynchronous Javascript And XML(异步 JavaScript 和 XML)

理解 Asynchronous (异步)

  • 在 HTML 中,使用 AJAX 构造发送 HTTP 请求,此时为异步等待
  • 当执行完发送请求代码后,就可以立即往下执行剩下代码,而不必等待服务器响应回来,当服务器响应回来之后,再由浏览器通知到代码中

代码示例

  • 此处我们引入 jquery 来进行 AJAX 请求的构造
  • jquery 的 api 对原生 api 进行了封装,使用起来简便很多

步骤一:

步骤二:

步骤三:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 引入 jquery -->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
    <script>
        $.ajax({
            type:'get',
            url:'https://www.baidu.com?studentName=lisi',
            // 此处 success 就声明了一个回调函数,就会在服务器响应返回到浏览器的时候触发该回调
            // 正是此处的 回调 体现了 "异步"
            success: function(data) {
                console.log("在服务器返回响应到达浏览器之前,浏览器触发该回调,通知到代码中!")
            }
        });
        console.log("浏览器立即往下执行后续代码!");
    </script>
    
</body>
</html>
  • 我们使用 Fiddle 将我们构造的请求进行抓包

注意:

  • AJAX 的功能更强,不仅支持 GET 和 POST,同时也支持 DELETE、PUT 等方法
  • AJAX 构造的请求可以灵活设置 header
  • AJAX 发送请求的 正文body 也可以灵活设置

Postman 构造

  • 使用第三方工具,更加便捷的构造 HTTP 请求

步骤一:

步骤二:

步骤三:打开安装好的 Postman,先进行注册登录,在进行下面步骤

步骤四:

步骤五:

步骤六:

步骤七:

  • 完成以上步骤,我们便可以使用 Postman 来构造一个 HTTP 请求了!

注意:

  • Postman 还有一个很好用的功能,可以生成构造请求的对应代码

步骤一:

步骤二:

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

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

相关文章

k8skubectl陈述式及声明式资源管理及金丝雀部署

文章目录 一.陈述式资源管理方法1.陈述式资源管理概念2.基本信息查看&#xff08;1&#xff09;查看版本信息&#xff08;2&#xff09;查看资源对象简写&#xff08;3&#xff09;查看集群信息&#xff08;4&#xff09;配置kubectl自动补全&#xff08;5&#xff09;node节点…

放弃webstrom转战vscode

本来是webstrom的忠实用户&#xff0c;无奈webstrom要么需要在网上找一个破解版或者不断的去找激活码&#xff0c;且破解版和激活码的文章总是很多&#xff0c;但是要找到真正有效的却总是要花费不少功夫。终于忍无可忍&#xff0c;转战vscode。&#xff08;注&#xff1a;文中…

MQTT上传图片数据的4G低功耗摄像头解决方案

为什么要使用MQTT上传数据图片呢&#xff1f; MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络…

python使用蓝牙库选择

蓝牙库选择 pybluez 项目地址&#xff1a;https://github.com/pybluez/pybluez 文档地址&#xff1a;https://pybluez.readthedocs.io/en/latest/index.html 蓝牙支持&#xff1a;经典蓝牙 / BLE蓝牙【仅Linux】 平台支持&#xff1a; LinuxRaspberry PimacOSWindows✔️✔️…

本地搭建kafka并用java实现发送消费消息

1、下载kafka的jar包文件 https://www.apache.org/dyn/closer.cgi?path/kafka/3.1.0/kafka_2.12-3.1.0.tgz2、下载完成直接操作命令启动 1、打开新的terminal(终端)窗口&#xff0c;进入kafka的bin目录 启动zk./zookeeper-server-start.sh ../config/zookeeper.properties2、…

bash中执行比较的几种方法

bash 脚本中的 test 命令用于检查表达式的有效性&#xff0c;检查命令或表达式为 true 或者 false。此外&#xff0c;它还可以用于检查文件的类型和权限。 如果命令或表达式有效&#xff0c;则 test 命令返回0&#xff0c;否则返回1。 使用 test 命令 test 命令的基本语法如…

速卖通数据分析怎么看?速卖通数据分析工具有哪些?—站斧浏览器

速卖通数据分析怎么看&#xff1f; 1、关注销售指标&#xff1a;在进行速卖通数据分析时&#xff0c;卖家应特别关注销售指标&#xff0c;如销售额、订单量、转化率等。通过对这些指标的分析&#xff0c;卖家可以了解到自己店铺的销售状况以及变化趋势&#xff0c;进而采取相应…

【postgresql】 ERROR: multiple assignments to same column “XXX“

Cause: org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; 原因&#xff1a;or…

SpringCloud Gateway--Predicate/断言(详细介绍)中

&#x1f600;前言 本篇博文是关于SpringCloud Gateway–Predicate/断言&#xff08;详细介绍&#xff09;中&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以…

GraalJS及平台JS脚本能力建设

GraalJS及平台JS脚本能力建设 GraalJS替换Nashorn Oracle宣布弃用Nashorn Javascript引擎&#xff0c;最终将从未来所有的JDK中删除。 Nashorn最初是在JDK 8中引入的&#xff0c;用于取代Rhino脚本引擎。发布时&#xff0c;Nashorn是ECMAScript-262 5.1的完整实现&#xff0…

服务接口调用OpenFeign_日志增强

OpenFeign虽然提供了日志增强功能&#xff0c;但是默认是不显示任何日志的&#xff0c;不过开发者在调试阶段可以自己配置日志的级别。 OpenFeign的日志级别如下&#xff1a; NONE&#xff1a;默认的&#xff0c;不显示任何日志;BASIC&#xff1a;仅记录请求方法、URL、响应状…

CMU15-213 课程笔记 04-Floating Point

文章目录 浮点数如何用二进制表示IEEE 浮点数标准IEEE 浮点数实现IEEE 浮点数在内存里 E exp - bias 计算指数M 1.xxx 尾数计算举例&#xff1a;对一个浮点数进行转换一些关于浮点数的计算等等 浮点数如何用二进制表示 计算机内部的浮点数不是这样存在内存里的&#xff08;至…

解决vs2022项目文件夹内.vs文件夹容量虚高问题

打开系统显示隐藏文件夹 会在vs2022的项目文件夹内有一个.vs文件夹 在子目录里会有一个Browse.VC.db文件,我的项目代码只有120m,而这个db文件居然有70m 而且每次打开vs项目,会使这个文件发生容量变化,如果你的git项目恰好包含这个.vs文件夹,那就比较不爽了,每次都要更新这个文件…

Python中的设计模式 -- 单例

迷途小书童 读完需要 2分钟 速读仅需 1 分钟 当我们谈到单例模式时&#xff0c;可以想象一个非常特殊的餐厅&#xff0c;这个餐厅只有一个桌子&#xff0c;无论多少人来用餐&#xff0c;都只能坐在这个桌子上。这个桌子就是餐厅的单例&#xff0c;它保证了整个餐厅中只有一个桌…

数据结构学习笔记——查找算法中的树形查找(平衡二叉树)

目录 一、平衡二叉树的定义二、平衡因子三、平衡二叉树的插入和构造&#xff08;一&#xff09;LL型旋转&#xff08;二&#xff09;LR型旋转&#xff08;三&#xff09;RR型旋转&#xff08;四&#xff09;RL型旋转 四、平衡二叉树的删除&#xff08;一&#xff09;叶子结点&a…

进行 XSS 攻击 和 如何防御

跨站脚本攻击&#xff08;XSS 攻击&#xff09;是 Web 开发中最危险的攻击之一。以下是它们的工作原理以及防御方法。 XSS 攻击 跨站脚本攻击就是在另一个用户的计算机上运行带有恶意的 JS 代码。假如我们的程序没有对这些恶意的脚本进行防御的话&#xff0c;他们就会由我们的…

【刷题笔记9.25】LeetCode:相交链表

LeetCode&#xff1a;相交链表 一、题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 二、分析及代码 方法一&#xff1a;使用哈希Set集合 &#xff08;注意…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…

机器学习(19)---神经网络详解

神经网络 一、神经网络概述1.1 神经元模型1.2 激活函数 二、感知机2.1 概述2.2 实现逻辑运算2.3 多层感知机 三、神经网络3.1 工作原理3.2 前向传播3.3 Tensorflow实战演示3.3.1 导入数据集查看3.3.2 数据预处理3.3.3 建立模型3.3.4 评估模型 四、反向传播五、例题5.1 题15.2 题…

Qt/C++音视频开发56-udp推流和拉流/组播和单播推流

一、前言 之前已经实现了rtsp/rtmp推流&#xff0c;rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流&#xff0c;这种一般都需要依赖一个独立的流媒体服务程序&#xff0c;有没有一种更便捷的方式不需要这种依赖&#xff0c;然后又能实现推拉流呢&#xff0c;当然有的那就是udpp推流&a…