实战:用 Spring 的脑子写一个 FastAPI
Controller、DTO、校验、依赖注入在 FastAPI 里的对应物,以及自动生成的 Swagger 文档。
18 分钟 · 右栏代码可点击「运行」
同一个接口的两个世界
Java
1@RestController2@RequestMapping("/api")3public class UserController {45 @GetMapping("/users/{uid}")6 public Map<String, String> user(7 @PathVariable String uid) {8 return Map.of("id", uid);9 }10}11// 启动:mvn spring-boot:run
Python
1from fastapi import FastAPI23app = FastAPI()45@app.get("/api/users/{uid}")6def get_user(uid: str) -> dict[str, str]:7 return {"id": uid}89# 启动:uvicorn main:app --reload10# 文档:http://localhost:8000/docs 自动生成
- 本课代码需要本地安装:
uv add fastapi uvicorn。游乐场跑不了 Web 服务,但语法都来自前面几课。
| Spring Boot | FastAPI | 备注 |
|---|---|---|
| @RestController | FastAPI() + 路由装饰器 | 函数即端点 |
| DTO + Bean Validation | Pydantic BaseModel | 校验规则写在类型上 |
| @Autowired / DI | Depends(...) | 依赖声明在参数里 |
| application.yml | .env + pydantic-settings | 类型化配置 |
| springdoc-openapi | 内置 | /docs 自动可用 |
| @Async / WebClient | async def 端点 | 原生异步 |
DTO 与校验:Pydantic 取代 Bean Validation
Java
1public record CreateUser(2 @NotBlank String name,3 @Email String email,4 @Min(0) int age5) {}
Python
1from pydantic import BaseModel, EmailStr, Field23class CreateUser(BaseModel):4 name: str = Field(min_length=1)5 email: EmailStr6 age: int = Field(ge=0)78# 校验失败自动返回 422,无需手写检查
到这一步,Java 迁移路线的「语言」部分已经完成。AI 方向的下一步通常是:httpx 调用大模型 API → pydantic 结构化输出 → 用 asyncio 并发请求。这些全是本路径已学概念的直接组合。