【抓包必看】拆解 HTTP 请求与响应结构+ Fiddler抓包实践
2026/7/17 6:26:56 网站建设 项目流程

目录

一、HTTP 协议基础认知

1. 什么是 HTTP?

2. HTTP 报文两大分类

二、URL 完整结构拆解

1. UTL格式

2.URL编码(URL string)

三、HTTP 报文详细格式

请求/响应报文四部分

四、HTTP 常用请求方法

1. 【经典面试题】GET / POST区别

2. 三点误区纠正

⚠️误区:POST 比 GET 更安全

⚠️误区:GET 传数据有长度上限

⚠️ 误区:GET 只能传文字、POST 才能传文件二进制


各位铁铁好哇👋!最近学习了网络编程中的http协议的相关知识,本文将对我所学习到的相关知识做总结,内容包括HTTP协议、URL格式、URL编码、请求方法、请求报文和响应报文等知识。

在讲述HTTP相关报文知识时,我将会用到Fiddler抓包工具辅助大家对理论知识的理解。

一、HTTP 协议基础认知

1. 什么是 HTTP?

HTTP是指超文本传输协议,是工作在应用层的数据传输协议,同时也是浏览器、APP与服务器之间传输数据的标准协议。通常我们访问一个网址时,网址的最前面一般就是http://或者是https://(HTTPS 是跑在加密 TLS 通道上的 HTTP),这表示当前的请求是遵循的HTTP协议进行传输的。例如访问百度百科网址:

2. HTTP 报文两大分类

我们在进行网络交互的时候,所有的交互动作都是[ 一次请求<—>一次响应 ]这样成对出现的,一次请求,就会产生一个请求报文;一次响应,同样也会产生一个响应报文。故HTTP报文可以分为两类:

🔹请求报文:客户端(浏览器或APP)发送给服务器的数据

🔹响应报文:服务器处理后返回给客户端的数据

请求报文和响应报文的格式高度相似,分为以下4个部分:

首行请求头(header)空行消息体(body)

后面讲解HTTP报文详细格式的时候抓包了解清楚每一个部分。

二、URL 完整结构拆解

1. UTL格式

📌URL:统一资源定位符,用来定位互联网上任意资源的完整地址,比如网页、图片。

我们通常说的网址,其实就是URL,URL的格式定义一般是这样的:

协议名称://用户名:密码@主机名:端口号/资源路径?查询参数=参数值#锚点

🔹协议名称(必选):用来标识资源访问的协议,如 http、https、ftp等,后面紧跟://

🔹验证信息(可选):用户名:密码用于需要验证的服务器,但现在已经用的极少。

🔹主机名(必选):用来指定目标地址的域名/ip地址,如本地主机127.0.0.1

🔹端口号(可选):跟在:用后面,用来指定目的端口号,默认端口号可以省略。

🔹资源路径(可选):用来指定目标资源的路径,/表示根目录

🔹查询参数/值(可选):跟在?后面,参数和值是键值对,多个参数之间用&链接,参数=值

🔹锚点(可选):跟在#后面,用于定位到页面的指定某一片段。

🌰举个栗子:https://admin:123456@test.com:8080/article/list?id=1&sort=time#title

2.URL编码(URL string)

如果URL中出现非英文字符,例如+、-、*、/或中文字符等,不能进行直接传输,因为可能造成客户端或服务器在解析地址时出现误判和冲突,因此,需要将原来的URL地址经过URL编码才能顺利地进行数据传输,例如到网页上搜索c++:

可以看到,此时经过URL编码,原本的参数值 c++,变成了c%2B%2B,是怎么变的呢?其实2B就是符号 + 的十六进制编码,在前面加上%,就变成了URL编码。

三、HTTP 报文详细格式

请求/响应报文四部分

前面提到的,请求报文和响应报文的格式高度一致,所以我们一起讲他们的格式:

下面我们用Fiddler抓包工具来看看请求报文和响应报文:

打开fiddler,随机点击一个抓包成功的报文:

请求报文:

  1. 首行请求方法URL版本号
  2. 请求头:里面都是键值对,每一行有一个键值对,键和值之间用:连接。
  3. 空行:空一行,用来将请求头和消息体分开,方便识别。
  4. 消息体:请求的正文。

响应报文:

  1. 首行版本号状态码状态码描述
  2. 响应头:里面都是键值对,每一行有一个键值对,键和值之间用:连接。
  3. 空行:空一行,用来将请求头和消息体分开,方便识别。
  4. 响应体:响应的正文。

四、HTTP 常用请求方法

HTTP的请求方法如下:

方法说明支持的 HTTP 协议版本
GET获取资源1.0、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获得报文首部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINE断开连接关系1.0

请求方法有很多,但是最常用的就是GET和POST方法,一般获取html、js、css等的都是get方法,而登录、上传文件等场景一般是用post方法。

1. 【经典面试题】GET / POST区别

首先,get和post方法没有本质的区别,一般都是混着用的,从使用方法的习惯上来说,主要是两个方面的区别:

✅ 语义上的区别

✅ GET方法通常将数据放在 query string(查询字符串) 中,而POST通常是把数据放在body(消息体)中;

✅ GET方法通常建议是设计成幂等的,而POST无要求。

何为等幂?就是多次发送请求,得到的响应就是一次发送请求的结果。为什么要这么设计呢?例如支付请求,如果不小心点了多次支付,那最终的响应也只是一次支付过后的结果。

✅ GET被设计成幂等的,那么也就允许GET请求保存在缓存上,POST不是幂等的,也就不会被保存在缓存上。

2. 三点误区纠正

⚠️误区:POST 比 GET 更安全

  • GET 会把账号密码拼在网址里,地址栏一眼就能看见,本地历史记录也会保存;
  • POST 只是数据藏在请求体里,不会显示在地址栏,但没加密的话抓包照样能看见内容
  • 真正决定安不安全的是 HTTPS 加密,和用 GET/POST 没关系。

⚠️误区:GET 传数据有长度上限

  • 以前老 IE 浏览器才限制网址长度,现在 Chrome、Edge、各类服务器都没这个硬性限制,长 URL 照样能正常访问。

⚠️ 误区:GET 只能传文字、POST 才能传文件二进制

  • GET 网址只能放文字,但二进制文件可以转成 Base64 文本塞进 URL;
  • 理论上 GET 也能携带请求体传二进制,只是绝大多数浏览器、后端服务不兼容,开发里基本没人这么用。

一句话总概括

网上流传的 GET 和 POST 三条区别都不严谨: 安全看是否 HTTPS 加密,不是请求方法;URL 长度限制早已过时;GET 也能间接传二进制,只是不推荐。

好了,今天的分享就到这而叭,希望可以帮助到大家,对java后端感兴趣的小伙伴可以点个关注加收藏哦~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询