如何在FastAPI中灵活使用路径参数、查询参数和请求体参数进行接口设计

In FastAPI, you can handle different types of parameters in your endpoints, such as path parameters, query parameters, and request body parameters. Each type of parameter is handled differently depending on how it is defined in the endpoint function.

1. Path Parameters

Path parameters are part of the URL path. They are typically used to pass resources or identifiers that are part of the route, for example, /items/{item_id}.

Example:

python 复制代码
@app.put("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

2. Query Parameters

Query parameters are part of the URL after the ? symbol, and they are used to pass additional data to the request. They are typically used with GET or PUT requests and are defined as function parameters without braces.

Example with a single query parameter:

python 复制代码
@app.put("/items/")
async def read_item(item_id: int):
    return {"item_id": item_id}

To test this with requests:

python 复制代码
import requests
url = 'http://127.0.0.1:8009/items/?item_id=5'
res = requests.put(url)
print(res.text)  # Output: {"item_id": 5}

3. Request Body Parameters

Request body parameters are used when you need to send structured data as the body of the request. These can be either single or multiple parameters passed as JSON in the request body.

Single Request Body Parameter

To specify that a parameter should be in the request body, you use Body().

Example:

python 复制代码
from fastapi import Body, FastAPI

@app.put("/items/")
async def read_item(item_id: int = Body(...)):
    return {"item_id": item_id}

To test with requests:

python 复制代码
import requests
url = 'http://127.0.0.1:8009/items/'
res = requests.put(url, json={"item_id": 5})
print(res.text)  # Output: {"item_id": 5}
Multiple Request Body Parameters

You can also define multiple parameters in the request body by using Body() for each one.

Example:

python 复制代码
from fastapi import Body, FastAPI

@app.put("/items/")
async def read_item(item_id: int = Body(...), name: str = Body(...)):
    return {"item_id": item_id, "name": name}

To test with requests:

python 复制代码
import requests
url = 'http://127.0.0.1:8009/items/'
res = requests.put(url, json={"item_id": 5, "name": "张三"})
print(res.text)  # Output: {"item_id": 5, "name": "张三"}

4. Using Pydantic Models for Request Body

You can also use Pydantic models to define request bodies, which gives you more control and validation over the incoming data.

Example:

python 复制代码
from fastapi import FastAPI
from pydantic import BaseModel

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

@app.put("/items/")
async def read_item(item: Item):
    return {"name": item.name, "price": item.price}

To test with requests:

python 复制代码
import requests
url = 'http://127.0.0.1:8009/items/'
data = {"name": "细胞生物学", "description": "考研书籍", "price": 35.8, "tax": 0.6}
res = requests.put(url, json=data)
print(res.text)  # Output: {"name": "细胞生物学", "price": 35.8}

5. Mixed Parameters (Path, Query, and Body)

You can also mix path, query, and body parameters in a single endpoint. FastAPI will automatically handle them correctly.

Example:

python 复制代码
from fastapi import Body, FastAPI

@app.put("/items/{name}")
async def read_item(name: str, age: int, item_id: int = Body(...)):
    return {"name": name, "age": age, "item_id": item_id}

Testing via FastAPI's Documentation

FastAPI also provides a built-in interactive docs interface at /docs that allows you to test all your endpoints directly in the browser. You can input values for query parameters, request body parameters, and see the results.

To access the docs:

  1. Run the FastAPI app.
  2. Open http://127.0.0.1:8009/docs in a browser.
  3. Test your endpoints using the interactive interface by clicking on "Try it out", filling in the parameters, and clicking "Execute".
相关推荐
重生之我是Java开发战士12 分钟前
【MySQL】数据库基础
数据库·mysql
ChuHsiang17 分钟前
【剑指MySQL】数据库基础(1)
数据库·mysql
muxin-始终如一29 分钟前
MySQL分区分表实现方法详解
数据库·mysql·adb
Tomorrow'sThinker38 分钟前
第三章 · 数据库管理与视频路径获取
数据库·oracle
IndulgeCui1 小时前
【金仓数据库产品体验官】Mycat适配KES分库分表体验
数据库
长安城没有风1 小时前
从入门到精通【Redis】初识Redis哨兵机制(Sentinel)
java·数据库·redis·后端
玉面小白龍(peng)1 小时前
sql优化进阶
数据库
Adorable老犀牛1 小时前
Linux-db2look创建表结构详细参数
linux·数据库·db2
disanleya2 小时前
MySQL时间格式转换,时间数据混乱不堪如何彻底重构?
数据库·mysql·重构
奥尔特星云大使2 小时前
mysql读写分离中间件——Atlas详解
数据库·mysql·中间件·dba·读写分离