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.com192.168.1.1 服务器域名或IP地址
端口(Port) :8080:443 服务器监听端口,HTTP默认80,HTTPS默认443
路径(Path) /api/user/profile 资源在服务器上的具体位置
查询参数(Query) ?id=123&name=test 键值对形式,传递额外信息给服务器

注意:查询参数以?开始,多个参数用&连接。这部分数据会暴露在URL中,因此不适合传递敏感信息。


HTTP请求的完整结构

一个标准的HTTP请求由三大部分组成,按顺序排列:

1
2
3
4
请求行(Request Line)
请求头部(Request Headers)
空行(CRLF,即\r\n)
请求体(Request Body,可选)

请求行(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
2
3
4
5
6
7
8
POST /api/login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=test&password=123456

核心头部字段深度解析

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”开头,这源于早期浏览器大战的历史遗留问题。

HTTP本身是无状态协议,即服务器不会自动记住之前的请求。Cookie就是为了解决这个问题而诞生的——它在客户端存储少量数据,用于维持会话状态。

Cookie工作机制

  1. 服务器通过响应头Set-Cookie设置Cookie
  2. 浏览器保存Cookie,并在后续请求中通过Cookie头部自动携带
  3. 服务器读取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