理解 HTTP,用 Python 手搓一个属于自己的 API
这一来一回,双方到底传的是什么?——两样东西都归一套规范管,它就是 HTTP。
再简单的 API,也得按 HTTP 的规矩来设计
curl -v 把真实报文调出来,亲眼验证http.server 手搓一个 API(GET /api/profile)这一节,我们要走到右边去——自己做那个「被调用方」。
GET / POST · 路径 · 协议版本GET /api/health HTTP/2名字: 值User-Agent: curl/8.7.12xx 成功 · 4xx 请求方问题 · 5xx 服务方问题HTTP/1.0 200 OKContent-Type——内容是什么格式Content-Type: application/json结构几乎对称,唯一区别在第一行:请求叫请求行,响应叫状态行。
所以调 DeepSeek 就是一次 POST——它回来的那段 JSON,是这次 POST 的响应,不是另一次 GET。
| GET | 把某样东西给我 |
| POST | 我提交一段内容,请你处理 |
| PUT | 用我给的内容,把某样东西整个换掉 |
| PATCH | 把某样东西改一部分 |
| DELETE | 把某样东西删掉 |
| HEAD | 跟 GET 一样,但只要头、不要体——探路用 |
| OPTIONS | 问一句:我能对这个资源做什么?(前后端联调时会再见到) |
不用记,扫一眼建立直觉——以后在真实报文里撞见,能大概猜到它在说什么。
| Host | 我找哪台机器 |
| User-Agent | 我是谁(什么工具 / 浏览器) |
| Accept | 我要什么格式 |
| Accept-Language | 我偏好什么语言 |
| Content-Type | 我提交的体是什么格式 |
| Content-Length | 我提交的体有多长 |
| Authorization | 身份凭证(Bearer sk-…) |
| Cookie | 随身带的「小纸条」 |
| Content-Type | 我回的是什么格式(本节主角) |
| Content-Length | 有多长 |
| Server | 我是什么服务器软件 |
| Date | 什么时间处理的 |
| Cache-Control | 能不能缓存 |
| Set-Cookie | 发一张「小纸条」给调用方 |
| Location | 内容搬家了,去新地址找 |
| Access-Control- Allow-Origin | 允许哪些来源的网页调用我 |
这还不是完整清单。见到不认识的头,一般可以不用管——就像刚才 ipify 那个 cf-ray。
http.server这是 HTTP 的要求,不是某个工具的要求——换语言、换框架,也照样得有人写。
孤勇之后
世界尽在眼前
下一节,FastAPI 登场——这一节亲手写下的杂活,会缩成几行。咱们下一节见。