FastAPI 请求和响应

在 FastAPI 中,请求(Request)和响应(Response)是与客户端交互的核心。

FastAPI 提供了强大的工具来解析请求数据,并根据需要生成规范的响应。

接下来我们来详细看下 FastAPI 的请求和响应。

请求数据

查询参数

以下实例中我们定义了一个 /items/ 路由,接受两个查询参数 skip 和 limit,它们的类型均为整数,默认值分别为 0 和 10

实例

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

在命令行中运行以下命令以启动应用:

uvicorn main:app --reload

现在,打开浏览器并访问 http://127.0.0.1:8000/items/,返回了默认的 JSON 数据:

传递 GET 请求的参数 http://127.0.0.1:8000/items/?skip=1&limit=5,返回 JSON 数据如下所示:

路径参数

我们可以把参数设置在路径上,这样 URL 看起来更美观一些。

以下实例我们定义了一个带有路径参数 item_id 和查询参数 q 的路由。

实例

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

传递 GET 请求的参数 http://127.0.0.1:8000/items/5/?q=runoob,返回 JSON 数据如下所示:

请求体

接下来我们创建了一个 /items/ 路由,使用 @app.post 装饰器表示这是一个处理 POST 请求的路由。

实例

from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
def create_item(item: Item):
    return item

使用 Pydantic 模型 Item 定义了一个请求体,包含多个字段,其中一些有默认值,更多 Pydantic 介绍参考:FastAPI Pydantic 模型

接下来我们可以打开 http://127.0.0.1:8000/docs 来进行 POST 测试:

填写请求参数:

返回结果如下:


响应数据

返回 JSON 数据

路由处理函数返回一个字典,该字典将被 FastAPI 自动转换为 JSON 格式,并作为响应发送给客户端:

实例

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

以上代码在浏览器访问 http://127.0.0.1:8000/items/,返回了 JSON 数据:

返回 Pydantic 模型

路由处理函数返回一个 Pydantic 模型实例,FastAPI 将自动将其转换为 JSON 格式,并作为响应发送给客户端:

实例

from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
def create_item(item: Item):
    return item

POST 请求,返回的数据格式如下所示:

{
  "name": "runoob",
  "description": "菜鸟教程 POST 测试",
  "price": 12,
  "tax": 1
}

请求头和 Cookie

使用 Header 和 Cookie 类型注解获取请求头和 Cookie 数据。

实例

from fastapi import Header, Cookie
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
    return {"User-Agent": user_agent, "Session-Token": session_token}

以上代码在浏览器访问 http://127.0.0.1:8000/items/,返回了 JSON 数据:


重定向和状态码

使用 RedirectResponse 实现重定向,将客户端重定向到 /items/ 路由。

实例

from fastapi import Header, Cookie
from fastapi import FastAPI
from fastapi.responses import RedirectResponse

app = FastAPI()

@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
    return {"User-Agent": user_agent, "Session-Token": session_token}

@app.get("/redirect")
def redirect():
    return RedirectResponse(url="/items/")

以上代码在浏览器访问 http://127.0.0.1:8000/redirect/ 会自动跳转到 http://127.0.0.1:8000/items/ 页面:

使用 HTTPException 抛出异常,返回自定义的状态码和详细信息。

以下实例在 item_id 为 42 会返回 404 状态码:

实例

from fastapi import HTTPException

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id == 42:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

以上代码在浏览器访问 http://127.0.0.1:8000/items/42/ 页面显示如下:


自定义响应头

使用 JSONResponse 自定义响应头:

实例

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    content = {"item_id": item_id}
    headers = {"X-Custom-Header": "custom-header-value"}
    return JSONResponse(content=content, headers=headers)

以上代码在浏览器访问 http://127.0.0.1:8000/items/42/ 页面显示如下,可以看到我们自定义的响应头:

### FastAPI请求响应的处理 #### 定义不同类型的HTTP请求 为了定义不同的 HTTP 请求,在 FastAPI 中使用特定的装饰器来区分请求的方法。`@app.get()`用于定义GET请求的 API;`@app.post()`用于定义POST请求的 API;同样地,还有 `@app.put()` `@app.delete()` 分别用于 PUT DELETE 请求[^1]。 #### 处理查询参数 对于带有查询参数的接口,可以直接在处理函数中定义这些参数。例如: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(name: str, age: int | None = None): return {"message": f"嘿,{name}-{age},欢迎再次学习"} ``` 此代码片段展示了如何接收名为 `name` 的必填字符串参数以及可选整数参数 `age`。 #### 返回JSON响应 FastAPI 自动将 Python 函数的结果转换成 JSON 格式的 HTTP 响应。比如下面的例子展示了一个简单的 GET 方法实现,它接受路径参数并返回相应的字典对象作为 JSON 响应: ```python from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id} ``` 这里,当访问 `/items/某个ID` 这样的 URL 时,服务器会根据提供的 ID 构建一个包含该项信息的对象,并将其序列化为 JSON 发送给客户端[^3]。 #### 使用 Pydantic 模型进行数据验证 通过继承自 Pydantic 的 `BaseModel`, 可以为 POST 或其他携带 body 的请求指定期望接收到的数据格式。这不仅简化了开发者的工作量,还增强了应用程序的安全性可靠性。考虑如下案例: ```python from pydantic import BaseModel from typing import Optional class Payload(BaseModel): key1: str key2: str @app.post("/submit/") async def submit_data(payload: Payload): # payload 已经经过了验证 ... ``` 在这个场景下,任何向 `/submit/` 发送的有效负载都必须遵循由 `Payload` 类所设定的模式—两个必需的字符串字段 (`key1` `key2`)。一旦输入不符合规定,则立即触发异常机制并向调用方反馈具体的错误详情[^5]。 #### 错误处理与自定义异常处理器 每当遇到未捕获的异常或是非法的数据提交情况,默认情况下 FastAPI 都能妥善应对并通过预设的方式告知前端发生了什么问题。然而,也允许开发人员针对某些特殊情况编写个性化的错误页面或消息提示逻辑。特别是关于表单验证失败的情形,可以通过重写内置的行为来自定义错误报告的形式[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值