理解HTTP请求/响应 📡
当您访问网站或使用应用程序时,计算机和服务器如何通信?它们使用一种叫做HTTP的规则!让我以简单的方式解释,即使是初学者也能理解。
用日常生活比喻HTTP?
让我们把HTTP比作餐厅点餐。
餐厅的故事 🍽️
1. 顾客:"请给我意大利面!"(请求)
2. 服务员:传达给厨房
3. 厨房:烹饪意大利面
4. 服务员:"您的意大利面来了!"(响应)
5. 顾客:收到意大利面
HTTP也一样:
1. 浏览器:"请给我index.html!"(HTTP请求)
2. 服务器:查找文件
3. 服务器:"这里是!"(HTTP响应)
4. 浏览器:显示页面
HTTP的定义
HTTP (HyperText Transfer Protocol)
- Web浏览器和服务器交换数据的规则
- 协议 = 约定的规则
- Web的基础通信方法
HTTP请求/响应流程
┌─────────┐ ┌─────────┐
│ │ ── HTTP请求 (Request) → │ │
│ 浏览器 │ │ 服务器 │
│ │ ← HTTP响应 (Response) ── │ │
└─────────┘ └─────────┘
完整过程
- 请求 (Request):浏览器向服务器请求某些内容
- 处理 (Processing):服务器处理请求
- 响应 (Response):服务器将结果发送给浏览器
- 渲染 (Rendering):浏览器在屏幕上显示
HTTP方法(请求方法)
这些是告诉服务器**"如何"**操作的动词。
1. GET 📖
"获取" - 请求数据
GET /products/123
示例:
- 查看网页
- 获取搜索结果
- 查看产品列表
特点:
- 只获取数据
- 不修改服务器数据
- 数据显示在URL中
- 可以添加书签
实际使用:
https://google.com/search?q=javascript
└───────┬──────┘
GET参数
2. POST 📝
"创建" - 向服务器发送新数据
POST /users
{
"name": "李明",
"email": "liming@example.com"
}
示例:
- 会员注册
- 写文章
- 下订单
特点:
- 在服务器上创建数据
- 数据在正文(Body)中
- 数据不显示在URL中
- 不能添加书签
3. PUT ✏️
"修改" - 完全替换现有数据
PUT /users/123
{
"name": "王芳",
"email": "wangfang@example.com"
}
示例:
- 修改整个个人资料
- 修改整篇文章
4. PATCH 🔧
"部分修改" - 只修改现有数据的一部分
PATCH /users/123
{
"email": "newemail@example.com"
}
示例:
- 只更改电子邮件
- 只更改密码
5. DELETE 🗑️
"删除" - 删除数据
DELETE /users/123
示例:
- 删除账户
- 删除文章
- 删除产品
HTTP方法比较表
| 方法 | 用途 | 数据修改 | 数据位置 |
|---|---|---|---|
| GET | 查询 | ❌ | URL |
| POST | 创建 | ✅ | Body |
| PUT | 完全修改 | ✅ | Body |
| PATCH | 部分修改 | ✅ | Body |
| DELETE | 删除 | ✅ | URL |
HTTP请求结构
GET /api/users?page=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer token123
{正文数据(POST、PUT、PATCH时)}
组成部分
-
请求行:
GET /api/users HTTP/1.1- 方法:GET
- 路径:/api/users
- HTTP版本:1.1
-
头部(Headers):附加信息
Host: 哪个服务器?
User-Agent: 哪个浏览器?
Accept: 接收什么格式?
Authorization: 认证信息 -
正文(Body):实际数据(POST、PUT、PATCH)
HTTP响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1234
{
"id": 1,
"name": "李明"
}
组成部分
-
状态行:
HTTP/1.1 200 OK- HTTP版本:1.1
- 状态码:200
- 状态消息:OK
-
头部(Headers):响应信息
Content-Type: 什么格式?
Content-Length: 数据大小 -
正文(Body):实际数据
HTTP状态码 🚦
服务器用数字告诉你**"发生了什么"**。
2xx - 成功 ✅
| 代码 | 含义 | 说明 |
|---|---|---|
| 200 | OK | 成功! |
| 201 | Created | 已创建新内容 |
| 204 | No Content | 成功但没有内容 |
3xx - 重定向 🔄
| 代码 | 含义 | 说明 |
|---|---|---|
| 301 | Moved Permanently | 永久移动 |
| 302 | Found | 临时在别处 |
| 304 | Not Modified | 未修改,使用缓存 |
4xx - 客户端错误 ❌
| 代码 | 含义 | 说明 |
|---|---|---|
| 400 | Bad Request | 请求错误 |
| 401 | Unauthorized | 需要登录 |
| 403 | Forbidden | 没有权限 |
| 404 | Not Found | 找不到 |
| 429 | Too Many Requests | 请求过多 |
5xx - 服务器错误 🔥
| 代码 | 含义 | 说明 |
|---|---|---|
| 500 | Internal Server Error | 服务器出现问题 |
| 502 | Bad Gateway | 网关错误 |
| 503 | Service Unavailable | 服务不可用 |
提示
在HTTP Status Guide查看所有状态码!
实践示例
示例 1:搜索 🔍
请求:
GET https://google.com/search?q=javascript
响应:
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>搜索结果...</body>
</html>
示例 2:登录 🔐
请求:
POST https://api.example.com/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password123"
}
响应(成功):
HTTP/1.1 200 OK
Content-Type: application/json
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": 1,
"name": "李明"
}
}
响应(失败):
HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
"error": "Invalid email or password"
}
示例 3:创建文章 ✍️
请求:
POST https://api.example.com/posts
Content-Type: application/json
Authorization: Bearer token123
{
"title": "第一篇文章",
"content": "你好!"
}
响应:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 42,
"title": "第一篇文章",
"content": "你好!",
"createdAt": "2025-01-23T10:30:00Z"
}
示例 4:修改个人资料 ✏️
请求:
PATCH https://api.example.com/users/me
Content-Type: application/json
Authorization: Bearer token123
{
"email": "newemail@example.com"
}
响应:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "李明",
"email": "newemail@example.com"
}
示例 5:删除文章 🗑️
请求:
DELETE https://api.example.com/posts/42
Authorization: Bearer token123
响应:
HTTP/1.1 204 No Content
理解HTTP头部
常用请求头部
Content-Type: application/json # 发送的数据格式
Accept: application/json # 想要接收的数据格式
Authorization: Bearer token123 # 认证令牌
User-Agent: Mozilla/5.0... # 浏览器信息
Cookie: session=abc123 # Cookie