HTTP协议详解
HTTP协议概述
什么是HTTP协议?
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网中最核心的应用层协议之一。它定义了浏览器与服务器之间如何“对话”——当你打开网页、提交表单、加载图片时,背后都是HTTP协议在工作。
HTTP协议的工作模式非常简单:客户端发起请求,服务器返回响应。
- 请求:你的操作,比如访问某个网址、登录账号、注册新用户
- 响应:服务器返回的结果,比如登录成功、页面内容、错误提示
HTTP协议就是把人类的行为翻译成计算机能理解的“语言规范”。
URL结构解析
URL(Uniform Resource Locator,统一资源定位符)是互联网上每个资源的“门牌号”。理解URL的结构是掌握HTTP通信的第一步。
一个完整的URL格式如下:
1 | [协议]://主机名[:端口]/[路径][?查询参数] |
各组成部分详解:
| 组成部分 | 示例 | 说明 |
|---|---|---|
| 协议(Scheme) | http://、https:// |
定义资源访问方式,常见有HTTP、HTTPS、FTP等 |
| 主机名(Host) | www.example.com、192.168.1.1 |
服务器域名或IP地址 |
| 端口(Port) | :8080、:443 |
服务器监听端口,HTTP默认80,HTTPS默认443 |
| 路径(Path) | /api/user/profile |
资源在服务器上的具体位置 |
| 查询参数(Query) | ?id=123&name=test |
键值对形式,传递额外信息给服务器 |
注意:查询参数以
?开始,多个参数用&连接。这部分数据会暴露在URL中,因此不适合传递敏感信息。
HTTP请求的完整结构
一个标准的HTTP请求由三大部分组成,按顺序排列:
1 | 请求行(Request Line) |
请求行(Request Line)
请求行是HTTP请求的第一行,包含三个要素,用空格分隔:
1 | 请求方法 + 空格 + 请求路径 + 空格 + HTTP版本 |
示例:GET /index.html HTTP/1.1
常用请求方法
| 方法 | 含义 | 是否有请求体 | 典型场景 |
|---|---|---|---|
| GET | 获取资源 | 无 | 浏览网页、获取数据 |
| POST | 提交数据 | 有 | 登录、注册、表单提交 |
| PUT | 更新资源 | 有 | 修改用户信息 |
| DELETE | 删除资源 | 可有可无 | 删除记录 |
| HEAD | 获取响应头 | 无 | 检查资源是否存在 |
| OPTIONS | 查询支持的方法 | 无 | CORS预检请求 |
请求头部(Request Headers)
请求头部由多个键值对组成,每行一个,格式为键: 值。头部提供了请求的元数据信息。
常见请求头部字段
| 头部字段 | 作用 | 示例 |
|---|---|---|
| Host | 指定服务器域名和端口(HTTP/1.1必需) | Host: blog.example.com |
| User-Agent | 描述客户端软件及系统信息 | User-Agent: Chrome/98.0.4758.102 |
| Accept | 客户端可接受的响应数据类型 | Accept: application/json |
| Content-Type | 请求体的数据类型 | Content-Type: application/x-www-form-urlencoded |
| Content-Length | 请求体的字节长度 | Content-Length: 27 |
| Cookie | 客户端存储的会话信息 | Cookie: sessionid=abc123def456 |
| Authorization | 认证凭证 | Authorization: Bearer tokenxxx |
空行的重要性
很多人容易忽略的一点:请求头部结束后必须有一个空行(在HTTP协议中表现为\r\n\r\n)。这个空行是头部结束的标志,告诉服务器“头部到此为止,接下来是请求体(如果有的话)”。即使没有请求体,也必须保留这个空行。
请求体(Request Body)
请求体是可选的,主要用于POST、PUT等方法,携带实际提交的数据。数据格式由Content-Type头部指定。
常见的请求体格式:
- 表单数据:
application/x-www-form-urlencoded,格式如key1=value1&key2=value2 - JSON数据:
application/json,格式如{"username":"test","password":"123"} - 文件上传:
multipart/form-data
完整请求示例
1 | POST /api/login HTTP/1.1 |
核心头部字段深度解析
User-Agent —— 你是谁?
User-Agent(简称UA)是客户端向服务器表明身份的“名片”。服务器通过UA判断访问者使用的是哪种浏览器、操作系统甚至是爬虫程序。
格式:
1 | User-Agent: [软件名称]/[版本号] ([系统信息]) [其他信息] |
常见示例:
- Chrome浏览器:
1 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 |
- Firefox浏览器:
1 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0 |
几乎所有现代浏览器都以”Mozilla/5.0”开头,这源于早期浏览器大战的历史遗留问题。
Cookie —— 记住你是谁
HTTP本身是无状态协议,即服务器不会自动记住之前的请求。Cookie就是为了解决这个问题而诞生的——它在客户端存储少量数据,用于维持会话状态。
Cookie工作机制:
- 服务器通过响应头
Set-Cookie设置Cookie - 浏览器保存Cookie,并在后续请求中通过
Cookie头部自动携带 - 服务器读取Cookie识别用户身份
请求中的Cookie格式:
1 | Cookie: 键1=值1; 键2=值2; ... |
响应中的Set-Cookie格式:
1 | Set-Cookie: 键=值; 属性1=值1; 属性2=值2 |
常见Cookie属性:
Path=/:限定Cookie作用的路径范围HttpOnly:禁止JavaScript访问Cookie(防止XSS窃取)Secure:仅通过HTTPS传输SameSite=Lax:限制跨站请求携带Cookie(防CSRF)
GET vs POST 对比
| 对比维度 | GET | POST |
|---|---|---|
| 数据传输位置 | URL查询参数(?后面) | 请求体 |
| 数据可见性 | 完全暴露在URL中 | 不在URL中显示 |
| 数据大小限制 | 有限制(浏览器/服务器决定) | 理论上无限制 |
| 安全性 | 低,不适合敏感信息 | 相对较高 |
| 是否改变服务器状态 | 不应改变(幂等) | 通常会改变 |
| 能否被缓存 | 可以 | 一般不缓存 |
| 浏览器回退 | 无害 | 会重新提交(需确认) |
选择建议:
- 获取数据、搜索、查看 → 用GET
- 提交数据、登录、注册、上传文件 → 用POST








