Skip to content

请求参数

5.1 Request请求

我们通过浏览器访问后端的url地址,其实是向后端发送了一个http的request请求

graph
subgraph A [交互流程]
U[用户<br>浏览器/手机/平板]
B[FastAPI服务]
U --① Request请求<br>url地址+请求体数据--> B
B -- ② Response响应<br>数据--> U
end

我们既可以使用浏览器请求,也可以借助pycharm的http工具,模拟Request请求

注意:默认情况下,在浏览器的地址栏中输入网站直接请求发送的是GET请求方式

image-20251011123508358

5.2 Request数据提取

前端向后端传递数据方式主要有以下几种:

  1. 路径参数
  2. 查询字符串
  3. 请求体
  4. Header

5.2.1 URL 路径参数 (Path Parameters)

路径参数是 URL 路径本身的一部分,用于唯一标识或定位资源。

声明与自动类型转换

  • 声明方式:在路径装饰器中,使用 {parameter_name} 语法声明路径参数,并在函数参数中接收它 。
  • 类型强制转换:通过类型注解,FastAPI 会自动尝试进行类型转换。如果客户端提供的参数值无法转换为指定类型(例如,期望 int 却收到了 "hello"),FastAPI 会自动返回 422 Unprocessable Entity 错误,无需手动编写检查代码。

main.py中编写如下代码

1
2
3
4
# item_id: int 强制要求 item_id 必须是整数
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

image-20251011193815787

image-20251011195840285

5.2.2 URL 查询参数 (Query Parameters)

查询参数是 URL 中 ? 之后的部分,以 key=value 形式出现,通常用于过滤、分页或排序。

默认值与可选性

  • 定义方式:在路径操作函数中,任何未在路径中声明,且未使用 Body 等特殊函数修饰的参数,都被视为查询参数 。
  • 可选性与默认值:如果函数参数带有默认值(如 limit: int = 10),则该参数是可选的。如果客户端未提供,则使用默认值。如果参数没有默认值,则为必填参数 。

main.py文件中编写如下代码:

1
2
3
4
5
@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    # 如果客户端访问 /items/,则 skip=0, limit=10
    # 如果客户端访问 /items/?skip=20,则 skip=20, limit=10
    return {"skip": skip, "limit": limit}

image-20251011200117995

5.2.3 请求体 (Request Body)

请求体是客户端向服务器发送大量结构化数据的最主要方式,通常用于 POSTPUTPATCH 请求 。

注意:POST请求需要借助pycharm的http工具

Pydantic BaseModel 的核心作用

在进行请求体数据解析提取时,需要使用Pydantic进行数据获取和验证

  • 声明模型:必须定义一个继承自 pydantic.BaseModel 的类,使用 Python 类型注解定义期望的字段和结构 。
  • 声明请求体:将路径操作函数的参数类型注解设置为这个 Pydantic 模型(例如 item: Item)。FastAPI 会识别这是一个请求体参数,并执行以下流程 :
    1. 解析传入的 JSON 数据。
    2. 严格验证数据是否符合 Item 模型的定义。
    3. 如果验证成功,将一个 Item 类的实例注入到函数中。

main.py文件中编写如下代码:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    description: str | None = None

@app.post("/items/")
async def create_item(item: Item):
    # item 变量现在是一个经过验证的 Item 类的实例
    return item

test_main.http文件中编写如下代码

1
2
3
4
5
6
7
8
POST http://127.0.0.1:8000/items/
Accept: application/json

{
    "name": "heima",
    "price": 1.1,
    "description": "请求体数据"
}

image-20251011202459667

image-20251011202357124

除了上述主要来源外,FastAPI 还允许精确地从 HTTP 协议的其他部分提取数据,这需要使用 fastapi 中特定的函数进行标记。

I. HTTP 头部参数 (Header Parameters)

要从 HTTP 头部中提取参数,您需要导入并使用 Header 进行标记。

main.py中编写如下代码:

1
2
3
4
5
6
from fastapi import Header

@app.get("/token/")
# 提取名为 X-Token 的 HTTP 头部
async def read_items(x_token: str | None = Header(default=None)):
    return {"X-Token": x_token}

test_main.http文件中编写如下代码:

1
2
3
GET http://127.0.0.1:8000/token/
Accept: application/json
X-Token: klasdkqwlkasd

注意:Header数据编写格式:

X-Token后直接冒号

正确写法 X-Token: klasdkqwlkasd

错误写法 X-Token : klasdkqwlkasd

image-20251011211112324

Header的数据传入后字段转化规则:

大写会被转为小写,如: Tom --> tom

- 转化为 _, 如 User-Name --> user_name

要读取客户端发送的 Cookie,需要导入并使用 Cookie 函数。

main.py中编写如下代码:

1
2
3
4
5
6
from fastapi import Cookie

@app.get("/cookie/")
# 提取名为 session_id 的 Cookie
async def read_cookie(session_id: str | None = Cookie(default=None)):
    return {"session_id": session_id}

test_main.http文件中编写如下代码

1
2
3
GET http://127.0.0.1:8000/cookie/
Accept: application/json
Cookie: session_id=123456

image-20251011213530760

Cookie本质上也是Header中的数据,也可以通过Header获取cookie数据

1
2
3
@app.get("/cookie/")
async def read_cookie(cookie: str | None = Header(default=None)):
    return {"cookie": cookie}