首页 / 知识库 / 0基础入门-阅读资料 / 0基础-网络协议入门

第六章:补充知识(选学)

本章内容不是必须掌握的,但在 AI 应用开发中经常遇到。

建议先跳过,等实际开发中碰到了再回来查阅。


6.1 JSON —— HTTP 世界的”普通话”

什么是 JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。

虽然名字里有 JavaScript,但它和语言无关——Python、Java、Go …… 所有语言都支持。

AI API 的请求体和响应体,几乎 100% 使用 JSON 格式。

JSON 长什么样?

{
  "name": "张三",
  "age": 20,
  "is_student": true,
  "scores": [85, 92, 78],
  "address": {
    "city": "北京",
    "district": "海淀区"
  },
  "phone": null
}

JSON 的数据类型

类型示例Python 对应
字符串"hello"str
数字423.14intfloat
布尔值truefalseTrueFalse
空值nullNone
数组[1, 2, 3]list
对象{"key": "value"}dict

Python 中处理 JSON

import json

# Python 字典 → JSON 字符串
data = {"model": "gpt-4", "temperature": 0.7}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
# 输出: {"model": "gpt-4", "temperature": 0.7}

# JSON 字符串 → Python 字典
text = '{"name": "张三", "age": 20}'
obj = json.loads(text)
print(obj["name"])
# 输出: 张三

使用 requests 时不用手动处理

import requests

# 发送时:json 参数自动把字典转成 JSON 字符串
response = requests.post(url, json={"key": "value"})

# 接收时:.json() 方法自动把 JSON 字符串转成字典
data = response.json()

常见 JSON 错误

# ❌ 错误:用了单引号(JSON 只认双引号)
'{"name": 'hello'}'

# ❌ 错误:最后一项有多余逗号
'{"name": "hello", "age": 20,}'

# ❌ 错误:key 没有引号
'{name: "hello"}'

# ✅ 正确
'{"name": "hello", "age": 20}'

6.2 流式响应(Streaming)—— ChatGPT 的”打字效果”

现象

使用 ChatGPT 时,你会看到 AI 的回答是一个字一个字”打”出来的,而不是等全部生成完才一次性显示。

这就是流式响应(Streaming)

原理

普通请求(非流式):

客户端 ──请求──→ 服务器

                  │ (等待 AI 生成完整回答,可能需要 10 秒)

客户端 ←──完整响应── 服务器

流式请求:

客户端 ──请求(stream=true)──→ 服务器

客户端 ←── "你"                  │  ← 生成一个字就发一个字
客户端 ←── "好"                  │
客户端 ←── "!"                  │
客户端 ←── "有"                  │
客户端 ←── "什"                  │
客户端 ←── "么"                  │
客户端 ←── ...                   │
客户端 ←── [DONE]               │  ← 全部发完的信号

技术实现:SSE

流式响应底层使用的是 SSE(Server-Sent Events,服务器发送事件) 协议。

本质上还是 HTTP 响应,只是:

  • 响应头包含 Content-Type: text/event-stream
  • 响应体不是一次性发完,而是分多次发送
  • 每次发送一小块数据(一个 token)

Python 代码示例

import requests

response = requests.post(
    "https://api.openai.com/v1/chat/completions",
    headers={
        "Authorization": "Bearer sk-你的密钥",
        "Content-Type": "application/json"
    },
    json={
        "model": "gpt-4",
        "messages": [{"role": "user", "content": "讲个故事"}],
        "stream": True
    },
    stream=True
)

for line in response.iter_lines():
    if line:
        text = line.decode("utf-8")
        if text.startswith("data: ") and text != "data: [DONE]":
            import json
            chunk = json.loads(text[6:])
            content = chunk["choices"][0]["delta"].get("content", "")
            print(content, end="", flush=True)

print()

流式 vs 非流式

对比项非流式流式
用户体验等很久才看到完整回答逐字显示,感觉更快
首字时间慢(等全部生成完)快(生成第一个字就开始传)
实现复杂度简单稍复杂(需要逐块解析)
适合场景后台处理、批量调用聊天界面、实时交互

6.3 WebSocket —— 双向实时通信

HTTP 的局限

HTTP 是”一问一答”模式:客户端发请求,服务器回响应。服务器不能主动给客户端发消息。

HTTP 模式(单向):
客户端 ──请求──→ 服务器
客户端 ←──响应── 服务器
(必须客户端先问,服务器才能答)

WebSocket 的不同

WebSocket 是双向持续通信协议:连接建立后,双方可以随时互相发消息。

WebSocket 模式(双向):
客户端 ←──────→ 服务器
(任何一方都可以主动发消息)

建立过程

WebSocket 的建立很有趣——它先通过 HTTP 请求”升级”协议:

客户端 → 服务器:
  GET /chat HTTP/1.1
  Upgrade: websocket        ← "我想升级到 WebSocket"
  Connection: Upgrade

服务器 → 客户端:
  HTTP/1.1 101 Switching Protocols
  Upgrade: websocket        ← "同意升级"

(此后不再使用 HTTP,切换到 WebSocket 协议)

AI 开发中的应用场景

场景为什么用 WebSocket
AI 语音对话需要实时双向传输音频流
多人协作 AI 画板需要实时同步所有人的操作
AI 实时翻译边说边翻,需要持续双向通信
在线 AI 编程助手实时推送代码建议

Python 示例(了解即可)

import asyncio
import websockets

async def chat():
    async with websockets.connect("wss://example.com/ws") as ws:
        await ws.send("你好")
        response = await ws.recv()
        print(f"收到:{response}")

asyncio.run(chat())

大部分 AI 应用开发用 HTTP + SSE 就够了,只有需要真正双向实时通信时才用 WebSocket。


6.4 API Key 的安全注意事项

既然 HTTP 请求中要带 API Key,安全问题就很重要。

绝对不能做的事

❌ 把 API Key 写在前端 JavaScript 代码里
   → 用户按 F12 就能看到你的 Key

❌ 把 API Key 提交到 GitHub
   → 全世界都能看到,Key 会在几分钟内被盗用

❌ 把 API Key 发到群聊或社交媒体
   → 一旦泄露就可能产生巨额费用

正确做法

✅ 使用环境变量存储 API Key
✅ 把 API Key 放在 .env 文件中,.gitignore 排除
✅ 通过后端服务器转发 API 请求,不要在前端直接调用
✅ 定期轮换 API Key

代码示例

import os
from dotenv import load_dotenv

load_dotenv()

api_key = os.getenv("OPENAI_API_KEY")

if not api_key:
    raise ValueError("请设置 OPENAI_API_KEY 环境变量")

.env 文件:

OPENAI_API_KEY=sk-你的密钥

.gitignore 文件:

.env

6.5 常用 HTTP 工具推荐

工具类型适合场景难度
浏览器 F12内置工具查看网页请求
httpbin.org在线服务测试 HTTP 请求
curl命令行工具快速发送请求、查看详情⭐⭐
Postman图形界面工具调试 API、保存请求集合⭐⭐
Python requests代码库在代码中发送请求⭐⭐
Apifox图形界面工具中文 API 调试工具⭐⭐

本章小结

  1. JSON 是 AI API 的通用数据格式,Python 用 json 模块或 requests 库处理
  2. 流式响应让 AI 回答逐字显示,底层用 SSE 实现,本质还是 HTTP
  3. WebSocket 适合双向实时通信,大部分 AI 场景用不到
  4. API Key 安全很重要,用环境变量存储,永远不要提交到代码仓库
  5. 善用 HTTP 调试工具(F12、curl、Postman)能大幅提升开发效率

下一章提供一张总结速查表,方便你随时复习。


← 上一章:实战串联 | 下一章:总结速查表 →