Python FastAPI

FastAPI 的核心是用 Python 快速创建 AI 服务接口,让 Java 后端可以通过 HTTP 调用 Python 里的模型、RAG 或 Agent 能力。

FastAPI 是什么

FastAPI,中文可以理解为“快速 API Web 框架”。

它是 Python 生态里常用的 Web API 框架。

在 AI Agent 学习路线里,FastAPI 主要用来承接 Python AI 生态能力。

比如:

LangChain
LangGraph
RAG 实验
Embedding
Agent 工作流
评测脚本

Java 和 Python 的分工可以先这样理解:

Java:业务系统、权限、数据库、接口网关
Python:AI 编排、模型生态、Agent 实验
FastAPI:把 Python AI 能力暴露成 HTTP 接口

创建 FastAPI 服务

安装依赖:

python -m pip install fastapi uvicorn pydantic

Uvicorn,中文可以理解为“Python ASGI 服务器”。

ASGI,全称是 Asynchronous Server Gateway Interface,中文一般翻译为“异步服务器网关接口”。

创建 main.py

from fastapi import FastAPI

app = FastAPI(title="AI Service")


@app.get("/")
def health():
    return {
        "status": "ok"
    }

启动:

uvicorn main:app --reload --host 127.0.0.1 --port 8000

访问:

http://127.0.0.1:8000

接口文档:

http://127.0.0.1:8000/docs

定义请求响应

FastAPI 通常用 Pydantic 定义请求和响应。

Pydantic,中文可以理解为“Python 数据校验库”。

示例:

from pydantic import BaseModel, Field


class ChatRequest(BaseModel):
    message: str = Field(min_length=1)


class ChatResponse(BaseModel):
    answer: str

接口:

from fastapi import FastAPI

app = FastAPI(title="AI Service")


@app.post("/chat", response_model=ChatResponse)
def chat(request: ChatRequest):
    return ChatResponse(
        answer=f"收到问题:{request.message}"
    )

FastAPI 会自动完成:

读取 JSON 请求体
转换为 Pydantic 对象
校验字段类型
生成接口文档
校验响应结构

完整 main.py

from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI(title="AI Service")


class ChatRequest(BaseModel):
    message: str = Field(min_length=1)


class ChatResponse(BaseModel):
    answer: str


@app.get("/")
def health():
    return {
        "status": "ok"
    }


@app.post("/chat", response_model=ChatResponse)
def chat(request: ChatRequest):
    return ChatResponse(
        answer=f"收到问题:{request.message}"
    )

测试:

curl -X POST http://127.0.0.1:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"什么是 FastAPI?"}'

返回:

{
  "answer": "收到问题:什么是 FastAPI?"
}

Java 调用 Python

Java 后端可以用 HTTP 调用 FastAPI。

先定义 Java 请求响应对象:

public record PythonChatRequest(String message) {
}
public record PythonChatResponse(String answer) {
}

使用 RestClient 调用:

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

@Service
public class PythonAiClient {

    private final RestClient restClient;

    public PythonAiClient(RestClient.Builder builder) {
        this.restClient = builder
                .baseUrl("http://127.0.0.1:8000")
                .build();
    }

    public String chat(String message) {
        PythonChatResponse response = restClient.post()
                .uri("/chat")
                .body(new PythonChatRequest(message))
                .retrieve()
                .body(PythonChatResponse.class);

        if (response == null) {
            throw new IllegalStateException("Python AI 服务无响应");
        }

        return response.answer();
    }
}

Controller 可以继续由 Java 对外提供:

@PostMapping("/api/python-chat")
public ChatResponse chat(@RequestBody ChatRequest request) {
    String answer = pythonAiClient.chat(request.message());
    return new ChatResponse(answer);
}

链路:

前端
  -> Java Spring Boot
  -> Python FastAPI
  -> Python AI 能力
  -> Java 返回前端

接口异常处理

FastAPI 可以用 HTTPException 返回明确错误。

HTTPException,中文可以理解为“HTTP 异常”。

示例:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field

app = FastAPI(title="AI Service")


class ChatRequest(BaseModel):
    message: str = Field(min_length=1)


class ChatResponse(BaseModel):
    answer: str


@app.post("/chat", response_model=ChatResponse)
def chat(request: ChatRequest):
    if "error" in request.message:
        raise HTTPException(status_code=500, detail="模拟 Python AI 服务异常")

    return ChatResponse(answer=f"收到问题:{request.message}")

非法请求体会由 FastAPI 自动返回校验错误。

比如:

{
  "message": ""
}

会触发字段校验。

统一响应格式

学习阶段可以先保持简单响应。

后面 Java 和 Python 联调时,建议统一格式。

示例:

from typing import Generic, TypeVar

from pydantic import BaseModel

T = TypeVar("T")


class ApiResponse(BaseModel, Generic[T]):
    code: str
    message: str
    data: T | None = None

聊天数据:

class ChatData(BaseModel):
    answer: str

返回:

@app.post("/chat")
def chat(request: ChatRequest) -> ApiResponse[ChatData]:
    return ApiResponse(
        code="OK",
        message="success",
        data=ChatData(answer=f"收到问题:{request.message}")
    )

统一响应格式的好处:

Java 端更好解析
错误码更清楚
日志更容易统一
后面联调更稳定

Java 调用异常处理

Java 调 Python 服务时要考虑:

Python 服务没启动
连接超时
读取超时
返回 4xx
返回 5xx
响应结构不符合预期

可以先做基础兜底:

public String chat(String message) {
    try {
        PythonChatResponse response = restClient.post()
                .uri("/chat")
                .body(new PythonChatRequest(message))
                .retrieve()
                .body(PythonChatResponse.class);

        if (response == null) {
            return "Python AI 服务无响应";
        }

        return response.answer();
    } catch (Exception e) {
        return "Python AI 服务暂时不可用";
    }
}

正式项目里不要直接吞异常。

至少要记录:

requestId
请求路径
请求耗时
错误类型
Python 服务地址

目录建议

python-fastapi-demo
├── main.py
├── requirements.txt
├── README.md
└── app
    ├── __init__.py
    ├── schemas.py
    ├── routers
    │   └── chat.py
    └── services
        └── ai_service.py

简单项目可以先只有 main.py

后面接口多了,再拆成:

schemas:请求响应模型
routers:接口路由
services:业务逻辑
config:配置

requirements.txt

requirements.txt 用来记录 Python 依赖。

示例:

fastapi
uvicorn
pydantic
python-dotenv

安装:

python -m pip install -r requirements.txt

后面接大模型 API 时,再加入:

openai  # 通过 DashScope OpenAI 兼容接口调用 qwen3.5-flash
langchain
langgraph

常见问题

为什么要 Java 调 Python

Java 适合做稳定业务系统。

Python 适合接 AI 生态。

通过 HTTP 拆分后,两边可以各自使用适合的技术栈。

FastAPI 的 docs 页面有什么用

/docs 是自动生成的接口调试页面。

可以直接查看接口路径、请求体、响应结构,并发起测试请求。

这对 Java 调 Python 前的联调很有用。

GET 请求能不能带请求体

不建议。

FastAPI 官方也更推荐使用 POSTPUTPATCHDELETE 等方法发送请求体。

聊天、分类、RAG 查询这类接口一般用 POST

Java 调 Python 要不要加超时

要加。

大模型接口可能比较慢。

Java 侧不能无限等待。

后面需要补:

连接超时
读取超时
重试
熔断
降级
调用日志

本节先把最小 HTTP 调用跑通。

练习清单

完成几件事情:

能创建 FastAPI 服务
能启动 uvicorn
能访问 /docs
能用 Pydantic 定义请求和响应
能写 /chat 接口
能用 curl 调用 FastAPI
能用 Java RestClient 调用 Python 接口
知道 Java 调 Python 要处理超时和异常

建议目录:

ai-agent-study
├── python
│   └── fastapi-ai-service
│       ├── main.py
│       ├── requirements.txt
│       └── README.md
├── java
│   └── spring-ai-chat-demo
│       └── PythonAiClient.java
└── docs
    └── python-fastapi.md

小结

本节的结论:

FastAPI 是 Java 后端接入 Python AI 能力的 HTTP 服务层,先跑通请求、响应、校验和异常处理。

最小链路:

Java Spring Boot
  -> HTTP
  -> Python FastAPI
  -> 返回 JSON
  -> Java 解析并返回前端

这一步完成后,后面 LangChain、LangGraph、RAG、Agent 都可以先放在 Python 服务里,再由 Java 调用。

参考资料


这个家伙很懒,啥也没有留下😋