[Java EE] 网络原理(2) http

https://blog.csdn.net/Boop_wu/article/details/155679679?fromshare=blogdetail&sharetype=blogdetail&sharerId=155679679&sharerefer=PC&sharesource=Boop_wu&sharefrom=from_linkhttps://blog.csdn.net/Boop_wu/article/details/155679679?fromshare=blogdetail&sharetype=blogdetail&sharerId=155679679&sharerefer=PC&sharesource=Boop_wu&sharefrom=from_link

HTTP协议是应用层协议,基于TCP/IP工作,用于客户端和服务器间传输超文本数据。HTTP报文由请求/响应行、报头和正文组成,通过空行分隔。请求方法包括GET(获取资源)和POST(提交数据),GET参数通过URL传递,POST通过请求体传递。响应包含状态码和响应数据。URL编码确保特殊字符正确传输。使用工具如Fiddler可分析HTTP流量,Postman可构造请求。HTTP具有无状态、明文传输等特点,是互联网核心协议之一

1.http

HTTP (Hyper Text Transfer Protocol 超文本传输协议) , 是应用层协议 , 基于 TCP/IP 协议族工作 , 用于客户端和服务器之间传输超文本(如 HTML,图片,JSON 等) , 是互联网核心协议之一

核心特点 : 无状态 , 明文传输 , 基于请求-响应模型

1.1 http 协议格式

以下 用 fiddler 抓包

简单设置一下fiddler

简单介绍 一下fiddler

|--------|----------------------------------------------------------------|
| 颜色 | 标识含义 |
| 红色 | 表示 HTTP 状态错误(对应 4xx、5xx 等错误状态码) |
| 黄色 | 表示 HTTP 状态需要身份认证(对应 401、407 等认证类状态码) |
| 灰色 | 两种场景:1. 数据流类型为 CONNECT(HTTPS 连接建立阶段的请求)2. 响应资源类型为图片(如 JPG、PNG) |
| 紫色 | 响应资源类型为 CSS 文件 |
| 蓝色 | 响应资源类型为 HTML 文件(网页主体) |
| 绿色 | 响应资源类型为 Script 文件(如 JavaScript) |
| 黑色 | 响应资源类型为对象数据(如 JSON、XML 等) |

①HTTP 请求

  • 首行: 方法+url+版本
  • Header : 请求属性 , 冒号分割的键值对 ; 每组用 \n 分隔 ; 遇到空行表示 Header 部分结束
  • Body : 空行后面的内容都是 Body ; Body 允许为空 ; 如果 Body 存在 , 则在 Header 中会有一个 Content-Length 来标识 Body 长度

②HTTP 响应

  • 首行 : 版本号+状态码+状态码解释
  • Header : 请求的属性 ; 用冒号分割的键值对 ; 每组属性之间用 \n 分割 ; 遇到空行表示 Header 部分结束
  • Body : 空行后面的内容都是 Body ; Body 允许为空 ; 如果 Body 存在 , 则在 Header 中会有一个 Content-Length 来标识 Body 长度 ; 如果服务器返回了一个 html 页面 , 那么 html 页面内容就在 Body 中

③ 协议格式总结

④ 在 HTTP 报文中空行的作用 : 🤬

  • 分隔报文中 Header 和 Body

由于 HTTP 在传输层依赖 TCP 协议 , TCP 是面向字节流的 , 如果没有这个空行 , 就会出现粘包问题

Header 包含请求行/状态行 , 各类首部字段(Content-Type,Cookie 等)

Body 是实际传输的内容(如 HTML,JSON 等)

  • 确保报文结构的可读性和解析正确性

🎟️下文详细说明 HTTP 请求和响应的报文的具体内容🎟️

2.HTTP 请求报文(客户端->服务器)

2.1 起始行 :

格式 : 请求方法 + URL + 协议版本

2.1.1 URL

URL (Uniform Resource Locator 统一资源定位符)

协议方案名 : 常见的有 http 和 https 也有其他类型(jdbc:mysql)

登录信息 : 早期层用 user:pass@的形式在 URL 中携带账号密码 , 现因安全问题已经极少使用了

服务器地址 : 域名 , 域名会通过 DNS 系统解析成一个具体的 IP 地址(通过 ping 命令可以看到真实的 IP 地址)

端口号 : 浏览器会自动根据协议来匹配(如 http 为 80,https 为 443)

文件路径 : 表示服务器上的资源的位置

查询字符串(query string) : 是键值对结构 , 键值对之间使用&分隔 , 键和值之间使用=分隔

片段标识符 : 用于页面内的锚点跳转 (格式为#xxx)

① 使用 ping 命令查看域名对应的 IP 地址
②query string

?键=值&键=值

? : 用来分隔 URL 和 querystring

= : 连接键和值

& : 连接键值对的

③URL 中可省略的部分

|----------------|---------------------------------------------------------------------------------------------|
| URL 组成部分 | 省略规则及默认行为 |
| 协议名 | 可省略,默认使用http://(注:部分现代浏览器会自动升级为https,但标准默认是http |
| IP 地址 / 域名 | 在 HTML 标签(如img/link/script/asrc/href )中可省略,默认与当前 HTML 所在的服务器 IP / 域名一致 |
| 端口号 | 可省略,http协议默认用 80 端口,https协议默认用 443 端口 |
| 带层次的文件路径 | 可省略,默认等价于/(根路径),多数服务器会自动访问根路径下的/index.html(首页文件) |
| 查询字符串 | 可省略,省略后不向服务器传递额外参数 |
| 片段标识 | 可省略,省略后不进行页面内锚点跳转 |

补充 : URL 的省略规则是为了简化书写 , 实际使用需要注意使用场景限制 :

域名省略仅适用于同域名资源引用

④URLencode(URL 编码)

URL 编码是一种将 URL 中 "非安全字符" 转换为特定格式的规则 , 目的是避免字符冲突 , 确保 URL 能正确传输

转义规则 : 将需要转码的字符转为 16 进制 , 然后从左向右取 4 位(不足 4 位直接处理掉) , 每 2 位做 1 位 , 前面加上% , 编码成%XY 的格式

需要转码的字符 :

  • 特殊字符 : 空格 & = ? # 等(这些是 URL 结构的字符 , 直接使用会破坏原来的语义)
  • 非 ASCLL 字符 : 中文 @ $ 等
  • 控制字符 : 不可打印字符

示例 : 以字符 国 为例(UTF-8 为E59BBD , 6 位 十六进制) , 转码后 :%E5%9B ; 以字符 # 为例 (ASCLL 为 23 , 2 位十六进制) , 转码后 : 无有效编码(直接丢弃该字符的转码请求)

urldecode 就是 urlencode 的逆过程

https://tool.chinaz.com/Tools/urlencode.aspx

2.1.2 方法(method)

HTTP 方法 , 是客户端向服务端发送请求的动作指令 , 用于指定对目标资源的操作类型 ; 在 RESTfull API 设计和 Web 开发中(SpringBoot 后端)

此处只详细讲部分方法 , 后续方法会通过 SpringBoot 内容来详细讲解

🎟️① GET 方法(最常用)

作用获取资源(只读操作) , 从服务器查询并返回指定资源

特点

  • 幂等(多次请求结果相同) , 安全(不修改服务器数据)
  • 请求参数通过**查询字符串(URL?key=value)**传递 , 长度有限制
  • 首行 第一部分为 GET ; URL 的 query string 内容可以为空也可以不为空 ; header 部分有若干个键值对结构 ; body 部分为空

示例 : 在浏览器中直接输入 URL 会发送一个 GET 请求 或者 HTML 中的 link , img , script 标签 也会触发 GET 请求 ;

🎟️② POST 方法(常用)

作用 : 创建资源 , 向服务器提交数据以生成新资源

特点 :

  • 非幂等(多次请求可能创建多个资源)
  • 请求参数通过请求体 (Request Body) 传递 , 支持复杂数据 (如 JSON,表单) , 无长度限制
  • 首行 第一部分为 POST ; URL 的 query string 一般为空(也可以不为空) ; header 部分有若干键值对结构 ; body 部分一般不为空
🎟️③ POST 和 GET 区别
  1. 语义不同 : GET 一般用于获取数据 ; POST一般用于提交数据
  2. GET 的 Body 一般为空 , 需要传递的数据通过 query string 传递 ; POST 的 query string 一般为空 , 需要传递的数据通过 Body传递
  3. GET 请求一般是幂等 的 , POST 请求一般是不幂等的(幂等 : 多次请求得到的结果一样)
  4. GET 可以被缓存 , POST 不能被缓存(与幂等相关)

补充 :

2.1.3 协议版本

主流为 HTTP/1.1,也支持 HTTP/2,格式固定为「HTTP / 主版本号。次版本号」

实例 :

复制代码
GET /index.html HTTP/1.1
POST /api/login HTTP/1.1

🎟️2.2 报头(header)

格式 : 键值对结构(为 Key: Value 键值对,每组占一行,末尾以 \r\n 结束)

|--------------------|----------------------------------|---------------------------------------------------------------------------|
| 头部字段 | 作用 | 实例 |
| Host | 指定服务器主机的地址和端口 | Host: job.xjtu.edu.cn |
| Content-Length | 正文长度(字节数) | Content-Length: 45 |
| Content-Type | 正文数据格式(仅 POST/PUT 等有正文时需要指定) | application/json(JSON 格式)、application/x-www-form-urlencoded(表单格式) |
| User-Agent(UA) | 客户端标识(浏览器/操作系统信息) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 |
| Refere | 跳转来源页面 URL(直接输入地址时无此头部) | Referer:http://job.xjtu.edu.cn/companyLogin.do |
| Cookie | 客户端存储身份标识的信息 | JSESSIONID=D628A75845A74D29D991DB47A461E4FC |
| Accept | 客户端支持的响应数据格式 | Accept: text/html,application/json |

2.3 空行

头部结束后必须跟一个空行(仅 \r\n),用于明确分隔头部和正文。即使无正文,空行也不可省略,否则服务器会解析失败(避免 TCP 粘包问题)

2.4 正文(Body)

可选性:GET 方法无正文(参数通过 URL 传递),POST、PUT 等方法需通过正文提交数据

格式规则 :正文格式由 Content-Type 头部指定 :

  • 表单格式application/x-www-form-urlencoded):username=hgtz2222&password=222222222
  • JSON 格式application/json): {"username":"123456789","password":"xxxx","code":"jw7l"}
  • 文件上传格式multipart/form-data): 含边界符分隔文件与普通字段,如: WebKitFormBoundary8d5Rp4eJgrUSS3wT 分隔 PDF 文件数据

3.HTTP 响应报文(服务器->客户端)

3.1 起始行

格式 : 版本协议 + 状态码 + 状态描述

3.1.1 状态码

补充

https://www.runoob.com/http/http-status-codes.html

🎟️3.2 报头(Header)

格式 : 与请求报头类似 , 为 Key: Value 键值对,每组占一行,末尾以 \r\n 结束

|--------------------|-------------------------|---------------------------------------------------------------------------------------|
| 头部字段 | 作用 | 实例 |
| Server | 服务器软件类型及版本 | Server: YxlinkWAF , Server: Nginx/1.21.0 |
| Content-Type | 正文数据格式(含字符编码) | text/html;charset=UTF-8 , application/json;charset=utf-8 |
| Content-Length | 正文长度(字节数) | Content-Length:120 |
| Date | 响应发送时间(GMT 格式) | Date: Fri,29 Sep 2017 05:10:13 GMT |
| Set-Cookie | 向客户端设置 Cookie(状态管理) | Set-Cookie:gitee-session-n=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllE |
| Location | 重定向地址(仅 3xx 状态码时存在) | Location:https://gitee.com/HGtz2222 |
| Cache-Control | 缓存策略 | Cache-Control:max-age=3600(缓存 1 小时) |

3.3 空行

与请求报文一致,头部结束后必须跟空行(仅 \r\n),用于分隔头部与正文,不可省略

3.4 正文(Body)

可选性:状态码 204(No Content)时无正文,其他状态码可返回数据(如 HTML、JSON、图片等)

格式规则 :正文格式由 Content-Type 头部指定,文档中常见格式:

  • text/html:HTML 页面内容(如网页源码)
  • application/json:JSON 格式数据(如接口响应 {"code":200,"message":"success"}
  • 二进制格式:图片(image/jpeg)、文件(application/pdf)等

🎟️4.构造 HTTP 请求

推荐使用 PostMan

① 完整构造步骤

新建请求:打开 PostMan,点击左侧「+」号新建请求标签页

基础配置

  • 下拉选择请求方法(GET/POST/PUT/DELETE 等)
  • 输入完整 URL(如https://localhost:8080/api/user/login

参数配置

  • GET 请求:在「Params」标签页添加键值对(自动拼接至 URL 后,如userId=1001
  • POST/PUT 请求:

普通表单:切换至「Body」→ 勾选「x-www-form-urlencoded」,添加参数

JSON 格式:「Body」→ 「Raw」→ 选择「JSON」,输入 JSON 请求体(如{"username":"admin","password":"123456"}

文件上传:「Body」→ 「Form Data」,将参数类型改为「File」,选择本地文件

请求头配置 :在「Headers」标签页添加键值对(如Content-Type: application/jsonAuthorization: Bearer xxx

发送与查看:点击「Send」按钮,在下方「Response」面板查看响应状态码、响应体(格式化展示)

注意 : 由于作者抓包工具没设置好 , 有些场景难以复现

相关推荐
fulufulucode2 小时前
【网络协议】HTTPS相关知识详细梳理
网络·网络协议
yenggd2 小时前
华为SRv6 BE跨域配置案例
运维·网络·计算机网络·华为
LCG米2 小时前
基于LoRa的远距离低功耗农业传感器网络设计与实现(SX1278+STM32L071)
网络·stm32·php
thginWalker2 小时前
从打字机效果实现详解整包/流式传输、长/短连接、SSE、Streamable-HTTP、长轮询、WebSocket
网络协议
大布布将军3 小时前
⚡️编排的艺术:BFF 的核心职能——数据聚合与 HTTP 请求
前端·网络·网络协议·程序人生·http·node.js·改行学it
_F_y3 小时前
Socket编程UDP
网络·网络协议·udp
roman_日积跬步-终至千里3 小时前
【源码分析】StarRocks EditLog 写入与 Replay 完整流程分析
java·网络·python
车载测试工程师3 小时前
CAPL学习-AVB交互层-媒体函数1-回调&基本函数
网络·学习·tcp/ip·媒体·capl·canoe
爱尔兰极光3 小时前
计算机网络--TCP传输
网络·tcp/ip·计算机网络