如何在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".
相关推荐
ha_lydms9 分钟前
MaxCompute中加密与解密函数
大数据·数据库·数据仓库·hadoop·dataworks·maxcompute·odps
Shadow(⊙o⊙)30 分钟前
MySQL内置函数
数据库·mysql
笃行3501 小时前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
风早爽太2 小时前
用 ‌Render‌ 快速部署网站和常见问题解决
python·fastapi
快乐的木子李2 小时前
mysql-26.7.0-linux26.7.0下载安装
数据库·mysql
excel3 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
知行产研3 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
千里码aicood3 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
饺子大魔王的男人4 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap
可涵不会debug4 小时前
第一次学 LangGraph:用一个快递案例搞懂 State、Node、Edge 和 compile
服务器·数据库·mysql