(详细看语雀文档,这里只有一部分)
HTTP 请求与响应结构
HTTP 通信本质上是:
Client
↓ Request
Server
↓ Response
Client
HTTP Request
HTTP 请求通常由三部分组成:
请求行 Request Line
请求头 Request Headers
请求体 Request Body
例如:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "Navi"
}
请求行:
POST → Method,请求方法
/login → 请求路径
HTTP/1.1 → HTTP 版本
常见请求头:
Host → 访问的域名
User-Agent → 客户端信息
Accept → 希望接收的数据类型
Content-Type → 请求体的数据类型
Request Body 就是客户端真正提交的数据。
HTTP Response
HTTP 响应通常由三部分组成:
状态行 Status Line
响应头 Response Headers
响应体 Response Body
例如:
HTTP/1.1 200 OK
Content-Type: application/json
{
"name": "Navi"
}
状态行:
HTTP/1.1 → HTTP 版本
200 → Status Code,状态码
OK → 状态描述
常见响应头:
Content-Type → 返回的数据类型
Content-Length → 数据长度
Cache-Control → 缓存策略
Set-Cookie → 设置 Cookie
Response Body 就是服务器真正返回的数据。
总结
Request
= 请求行 + 请求头 + 请求体
Response
= 状态行 + 响应头 + 响应体
术语
- HTTP:HyperText Transfer Protocol,超文本传输协议
- Request:请求
- Response:响应
- Method:请求方法
- Header:头部
- Body:消息体
- Status Code:状态码
GET和POST区别
GET 和 POST 都是 HTTP Method(请求方法)。
GET
- 主要用于获取资源
- 参数通常放在 URL 的 Query String 中
GET /search?keyword=javascript&page=1
- GET 应该是 Safe(安全方法)
- 原则上不应该修改服务器资源
- GET 是 Idempotent(幂等)
- 请求一次和请求多次,对服务器产生的最终效果相同
- 更适合被浏览器、CDN 等缓存
- URL 长度可能受到浏览器或服务器限制,因此不适合传输大量参数
POST
- 主要用于提交数据或执行操作
- 数据通常放在 Request Body 中
POST /blogs HTTP/1.1
Content-Type: application/json
{
"title": "Hello"
}
- 常用于:
- 提交表单
- 创建用户
- 创建订单
- 发布博客
- POST 通常不是幂等的
例如:
POST /blogs
执行一次可能创建一篇博客,执行两次可能创建两篇博客。
- POST 默认情况下通常不会像 GET 一样被缓存,但 HTTP 并没有规定 POST 绝对不能缓存
- Request Body 本身没有 GET 那种 URL 长度问题,但实际数据大小仍可能受到服务器配置等限制
安全性
不能简单说:
POST 比 GET 更安全
GET 参数通常会显示在 URL 中:
/login?password=123456
因此更容易出现在:
- 浏览器历史记录
- 日志
- 地址栏
POST 数据通常在 Body 中,不会直接显示在 URL。
但:
GET 和 POST 本身都不负责加密。
真正保护数据传输安全的是:
HTTPS / TLS
GET vs POST
| GET | POST |
|---|---|
| 主要获取资源 | 主要提交数据 |
| 参数通常在 URL | 数据通常在 Body |
| Safe | 通常会产生副作用 |
| Idempotent | 通常非 Idempotent |
| 更适合缓存 | 默认较少缓存 |
| URL 长度可能受限 | Body 大小取决于服务器等限制 |
重点术语
Idempotent:幂等
同一个操作执行一次和执行多次,最终效果相同。
例如:
GET /user/1
执行 1 次和 10 次,都只是获取用户信息。
而:
POST /blogs
执行多次可能创建多篇博客,因此通常不是幂等的。
面试简答
GET 和 POST 都是 HTTP 请求方法。GET 主要用于获取资源,参数通常放在 URL 中,并且应该是安全、幂等的,也更适合缓存。POST 主要用于提交数据,数据通常放在请求体中,常用于创建资源或执行操作,通常不是幂等的。GET 和 POST 本身都不负责加密,真正的数据传输安全主要依赖 HTTPS。