第四章:HTTP 协议——应用层的通用语言
HTTP 是你在 AI 应用开发中最直接打交道的协议。
调用 API、访问网页、上传文件、获取数据——全都是 HTTP。
本章是全教程的重点章节,请认真阅读。
4.1 HTTP 是什么?
HTTP,全称 HyperText Transfer Protocol(超文本传输协议)。
虽然名字里有”超文本”,但实际上 HTTP 可以传输任何数据——文本、图片、视频、JSON ……
核心特点
| 特点 | 说明 | 类比 |
|---|---|---|
| 基于 TCP | HTTP 消息通过 TCP 连接传输 | 信通过快递送 |
| 请求-响应模式 | 客户端发请求,服务器回响应 | 你问我答 |
| 无状态 | 每次请求都是独立的,服务器不记住你 | 每次都要重新自我介绍 |
一句话理解
HTTP 定义了”你怎么向服务器提问”和”服务器怎么回答你”的格式。
4.2 HTTP 请求——你发出去的消息
每个 HTTP 请求由三部分组成:
┌─────────────────────────────────────────────────────┐
│ ① 请求行(Request Line) │
│ POST /v1/chat/completions HTTP/1.1 │
├─────────────────────────────────────────────────────┤
│ ② 请求头(Headers) │
│ Host: api.openai.com │
│ Authorization: Bearer sk-abc123... │
│ Content-Type: application/json │
│ User-Agent: python-requests/2.31.0 │
├─────────────────────────────────────────────────────┤
│ ③ 请求体(Body) │
│ { │
│ "model": "gpt-4", │
│ "messages": [ │
│ {"role": "user", "content": "你好"} │
│ ] │
│ } │
└─────────────────────────────────────────────────────┘
① 请求行
请求行包含三个信息:
POST /v1/chat/completions HTTP/1.1
│ │ │
│ │ └── 协议版本
│ └── 路径(要访问服务器的哪个接口)
└── 方法(要做什么操作)
② 请求头(Headers)
请求头是一系列 Key: Value 格式的附加信息,告诉服务器更多细节:
| 常见请求头 | 作用 | 示例 |
|---|---|---|
Host | 要访问的服务器域名 | api.openai.com |
Authorization | 身份认证信息 | Bearer sk-abc123... |
Content-Type | 请求体的数据格式 | application/json |
User-Agent | 客户端信息 | python-requests/2.31.0 |
Accept | 期望的响应格式 | application/json |
在 AI 开发中,最重要的两个请求头是 Authorization(API Key)和 Content-Type(数据格式)。
③ 请求体(Body)
请求体就是你要发送的实际数据。调用 AI API 时,请求体通常是 JSON 格式:
{
"model": "gpt-4",
"messages": [
{"role": "system", "content": "你是一个有帮助的助手"},
{"role": "user", "content": "帮我写一首诗"}
],
"temperature": 0.7
}
注意:GET 请求通常没有请求体,数据放在 URL 参数里。POST 请求才有请求体。
4.3 HTTP 请求方法——你要做什么操作
HTTP 定义了多种方法,最常用的有四种:
四种核心方法
| 方法 | 含义 | 类比 | 有请求体吗 | 常见场景 |
|---|---|---|---|---|
| GET | 获取数据 | 去图书馆借书 | 通常没有 | 打开网页、查询信息 |
| POST | 提交/创建数据 | 去邮局寄包裹 | ✅ 有 | 登录、调用 AI API |
| PUT | 更新(替换)数据 | 把旧书换成新版 | ✅ 有 | 修改用户资料 |
| DELETE | 删除数据 | 把书从书架上拿走 | 通常没有 | 删除一条记录 |
实际例子
GET /users/123 → 获取 123 号用户的信息
POST /v1/chat/completions → 向 AI 发送对话请求
PUT /users/123 → 更新 123 号用户的信息
DELETE /users/123 → 删除 123 号用户
AI 开发中最常用的
90% 的场景只用两个方法:
GET → 获取信息(查看模型列表、获取任务状态等)
POST → 提交请求(调用 AI 模型、上传文件等)
4.4 HTTP 响应——服务器的回答
服务器收到请求后,会返回一个 HTTP 响应,同样由三部分组成:
┌─────────────────────────────────────────────────────┐
│ ① 状态行(Status Line) │
│ HTTP/1.1 200 OK │
├─────────────────────────────────────────────────────┤
│ ② 响应头(Headers) │
│ Content-Type: application/json │
│ X-Request-Id: req_abc123 │
│ X-RateLimit-Remaining: 99 │
├─────────────────────────────────────────────────────┤
│ ③ 响应体(Body) │
│ { │
│ "id": "chatcmpl-abc123", │
│ "choices": [{ │
│ "message": { │
│ "role": "assistant", │
│ "content": "你好!有什么我可以帮助你的?" │
│ } │
│ }] │
│ } │
└─────────────────────────────────────────────────────┘
① 状态行
HTTP/1.1 200 OK
│ │ │
│ │ └── 状态描述(给人看的)
│ └── 状态码(给程序看的)
└── 协议版本
② 响应头
| 常见响应头 | 作用 | 示例 |
|---|---|---|
Content-Type | 响应体的数据格式 | application/json |
Content-Length | 响应体的大小(字节) | 1234 |
X-RateLimit-Remaining | 剩余调用次数 | 99 |
X-Request-Id | 请求唯一标识(排查问题用) | req_abc123 |
③ 响应体
服务器返回的实际数据。调用 AI API 时,通常是 JSON 格式的结果。
4.5 HTTP 状态码——必须记住的”暗号”
状态码是一个三位数,告诉你请求的结果。分为 5 大类:
五大分类
| 范围 | 含义 | 记忆口诀 |
|---|---|---|
| 1xx | 信息性(处理中) | “知道了,稍等” |
| 2xx | 成功 | “搞定了” |
| 3xx | 重定向 | “去别的地方找” |
| 4xx | 客户端错误 | “你的问题” |
| 5xx | 服务器错误 | “我的问题” |
快速判断:4xx 是你的错,5xx 是服务器的错。
必须记住的状态码
200 OK —— 成功
含义:请求成功,一切正常
场景:API 调用成功,拿到了 AI 的回答
心态:😊 开心,代码没问题
400 Bad Request —— 请求有误
含义:你发的请求格式有问题,服务器看不懂
常见原因:
- JSON 格式错误(少了引号、多了逗号)
- 缺少必填参数
- 参数类型不对(该传数字传了字符串)
排查:仔细检查请求体的 JSON 格式和参数
401 Unauthorized —— 未授权
含义:你没有提供有效的身份信息
常见原因:
- 没带 API Key
- API Key 写错了
- API Key 过期了
排查:检查 Authorization 请求头
403 Forbidden —— 禁止访问
含义:服务器知道你是谁,但你没有权限
常见原因:
- API Key 没有对应功能的权限
- 账户被封禁
- IP 被限制
排查:检查账户状态和权限设置
404 Not Found —— 找不到
含义:你要访问的资源不存在
常见原因:
- URL 路径拼写错误
- API 版本号不对
- 接口已下线
排查:仔细核对 URL
429 Too Many Requests —— 请求太多
含义:你调用太频繁了,超过了速率限制
常见原因:
- 短时间内发了太多请求
- 超过了套餐的调用额度
排查:降低调用频率,加入延时或重试逻辑
500 Internal Server Error —— 服务器内部错误
含义:服务器自己出了问题
常见原因:
- 服务器 bug
- 服务器过载
- 依赖的服务挂了
排查:不是你的问题,等一会儿重试,或联系服务提供商
状态码速查口诀
200 成功别高兴太早(还得看响应内容)
400 你的请求写错了
401 密码钥匙没带对
403 有钥匙但没权限
404 地址写错找不到
429 调太快被限流
500 服务器自己炸了
4.6 一个完整的 HTTP 交互示例
用调用 OpenAI API 作为例子,展示完整的请求和响应:
请求
POST /v1/chat/completions HTTP/1.1
Host: api.openai.com
Authorization: Bearer sk-abc123456789
Content-Type: application/json
{
"model": "gpt-4",
"messages": [
{"role": "user", "content": "用一句话解释什么是 TCP"}
]
}
响应
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_abc123
{
"id": "chatcmpl-xyz789",
"object": "chat.completion",
"model": "gpt-4",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "TCP 是一种确保数据在网络中完整、有序、可靠传输的通信协议。"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 18,
"completion_tokens": 30,
"total_tokens": 48
}
}
对应到 Python 代码
import requests
# 发送请求
response = requests.post(
url="https://api.openai.com/v1/chat/completions",
headers={
"Authorization": "Bearer sk-abc123456789",
"Content-Type": "application/json"
},
json={
"model": "gpt-4",
"messages": [
{"role": "user", "content": "用一句话解释什么是 TCP"}
]
}
)
# 检查状态码
if response.status_code == 200:
result = response.json()
answer = result["choices"][0]["message"]["content"]
print(f"AI 回答:{answer}")
else:
print(f"请求失败,状态码:{response.status_code}")
print(f"错误信息:{response.text}")
4.7 URL 的结构
每次发 HTTP 请求都要指定一个 URL,我们来拆解一下它的结构:
https://api.openai.com:443/v1/chat/completions?model=gpt-4&stream=true
│ │ │ │ │
│ │ │ │ └── 查询参数(Query Parameters)
│ │ │ └── 路径(Path)
│ │ └── 端口(Port,HTTPS 默认 443 可省略)
│ └── 域名(Host)
└── 协议(Schema)
| 部分 | 示例 | 说明 |
|---|---|---|
| 协议 | https | 用什么协议通信 |
| 域名 | api.openai.com | 服务器的地址 |
| 端口 | 443(通常省略) | 服务器的端口 |
| 路径 | /v1/chat/completions | 要访问的具体接口 |
| 查询参数 | ?model=gpt-4&stream=true | 附加参数(GET 请求常用) |
4.8 HTTP vs HTTPS
区别
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 全称 | HyperText Transfer Protocol | HTTP Secure |
| 端口 | 80 | 443 |
| 加密 | ❌ 明文传输 | ✅ SSL/TLS 加密 |
| 安全性 | 数据可被窃听、篡改 | 数据加密,安全可靠 |
| 现状 | 几乎已淘汰 | 所有正规网站和 API 都用 |
类比
HTTP = 明信片 → 内容写在外面,谁都能看
HTTPS = 密封信 → 内容加密封装,只有收件人能看
对你的影响
- 调用 AI API 时,URL 一定是
https://开头 - 如果你写成
http://,大概率会连不上或被拒绝 - 不需要深入了解 SSL/TLS 的原理,知道”HTTPS = 加密的 HTTP”即可
4.9 HTTP 版本简介
| 版本 | 发布年份 | 特点 | 你需要知道的 |
|---|---|---|---|
| HTTP/1.0 | 1996 | 每次请求都建新连接 | 已淘汰 |
| HTTP/1.1 | 1997 | 支持连接复用(Keep-Alive) | 目前仍广泛使用 |
| HTTP/2 | 2015 | 多路复用、头部压缩 | 主流 API 基本都支持 |
| HTTP/3 | 2022 | 基于 UDP(QUIC),更快 | 逐渐普及中 |
你不需要关心版本细节,浏览器和 HTTP 库会自动选择最优版本。
本章小结
- HTTP 定义了请求和响应的格式,是 AI 开发中最常用的协议
- 请求 = 请求行 + 请求头 + 请求体
- 响应 = 状态行 + 响应头 + 响应体
- 方法:GET(获取)、POST(提交)最常用
- 状态码:200 成功、4xx 你的错、5xx 服务器的错
- HTTPS = HTTP + 加密,现在都用 HTTPS
- URL = 协议 + 域名 + 端口 + 路径 + 参数
记住核心:调用 AI API = 发一个 HTTP POST 请求,拿一个 HTTP 响应。
下一章,我们把 TCP 和 HTTP 串起来,看看调用 AI API 时,从头到尾到底发生了什么。
← 上一章:TCP 协议 | 下一章:实战串联 →