接口开发
API概述
API,全称为 应用程序编程接口(Application Programming Interface),是一组定义了不同软件组件之间如何交互的规则和协议。API 允许不同的软件系统通过预定义的接口进行通信,使得开发者能够利用现有的功能和服务,而无需从头开始构建。这种模块化的设计不仅提高了开发效率,还促进了软件生态系统的扩展和创新。
一个典型的 API 包含以下几个关键组成部分:
- 请求(Request): 客户端向服务器发送的调用请求,通常包含请求的方法、URL、头信息和参数。
- 响应(Response): 服务器对客户端请求的返回结果,包含状态码、头信息和数据载体。
- 端点(Endpoint): API 提供的具体功能接口的 URL 地址。
- 方法(Method): 定义在特定端点上可以执行的操作,如 GET、POST、PUT、DELETE 等。
- 数据格式(Data Format): 传输数据的格式,常见的有 JSON、XML 等。
接口标准
| 特性 | OpenAI API 风格 | MCP | OpenAPI |
|---|---|---|---|
| 类型 | 商业 API 设计 | 开放通信协议 | 开放 API 描述规范 |
| 是否开放治理 | ❌(OpenAI 控制) | ✅(社区驱动) | ✅(Linux 基金会) |
| 是否可自由实现 | ⚠️(法律风险模糊) | ✅(MIT 许可) | ✅ |
| 是否有正式规范文档 | ✅(但非标准组织发布) | ✅(mcp.spec) | ✅(openapis.org) |
| 目标 | 调用 LLM | LLM 与工具通信 | 描述 RESTful API |
开发框架
任何一家公司都可以定义符合自己公司业务需求的 API,但是他们可能使用的都是同一套开发框架在 Python 中,有多种接口开发框架可供选择:
| 维度 | FastAPI | Django |
|---|---|---|
| 发布时间 | 2018 年 | 2005 年 |
| 开发语言 | Python | Python |
| 架构风格 | 微框架,基于 Starlette 和 Pydantic | 大型框架,支持全栈开发,内置 ORM、Admin 等 |
| 性能 | 高,基于 ASGI,支持异步特性 | 中等,依赖于 WSGI |
| 异步支持 | 原生支持,使用 async/await | 通过 Django 3.0+ 开始支持异步(仍在逐步完善) |
| 数据验证 | 内置 Pydantic,支持强类型和自动验证 | 依赖于表单类(如 Forms 和 DRF 的 serializers) |
| 自动文档生成 | 内置支持 OpenAPI 和 Swagger UI | 不原生支持,需依赖 Django REST Framework (DRF) |
| 学习曲线 | 中等,需了解类型注解和异步编程 | 较高,包含多种内置组件,适合系统性学习 |
| 社区和生态 | 新兴框架,社区成长迅速,但生态略小 | 最悠久且成熟,生态完善,适合大型项目 |
| 可扩展性 | 高,强大的原生功能减少了扩展需求 | 中等,内置组件强大,但灵活性相对较低 |
| 依赖注入支持 | 原生支持依赖注入 | 无原生支持 |
| 生产就绪 | 稳定性较高,但相比 Flask 和 Django 使用年限较短 | 成熟稳定,被广泛应用于大型生产系统 |
| 调试工具 | 支持 Starlette 的调试功能 | 内置调试模式,适合开发测试 |
| 使用场景 | 高性能、异步处理或自动文档的场景 | 大型系统开发,支持复杂业务逻辑和多用户系统 |
| ORM 支持 | 无原生支持,需借助 Tortoise-ORM 等 | 原生支持,提供 Django ORM |
| Admin 界面 | 无,需要自行开发 | 原生支持,提供强大的 Admin 管理后台 |
| 支持的 Python 版本 | Python 3.6+ | Python 3.8+ |
| 对类型注解的支持 | 原生支持,强类型友好 | 不直接支持,但可结合第三方库使用 |
FastAPI
安装:pip install "fastapi[standard]"
基础用法
相较于 Flask,FastAPI 会自动生成 2 种风格的 API 文档,地址为:http://127.0.0.1:8000/docs 和 http://127.0.0.1:8000/redoc
from fastapi import FastAPI, Header, HTTPException, Query, Path
from pydantic import BaseModel
from typing import Optional, Dict
app = FastAPI()
# Pydantic Models
class PostExampleModel(BaseModel):
title: Optional[str] = "默认标题"
content: Optional[str] = "默认内容"
class PutExampleModel(BaseModel):
name: Optional[str] = "