如何在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".
相关推荐
杰克尼1 小时前
MYSQL-175. 组合两个表
数据库·mysql
DemonAvenger1 小时前
MySQL索引原理深度解析与优化策略实战
数据库·mysql·性能优化
189228048612 小时前
NY270NY273美光固态闪存NY277NY287
服务器·网络·数据库·科技·性能优化
星霜笔记5 小时前
Docker 部署 MariaDB+phpMyAdmin+Nextcloud 完整教程
运维·数据库·docker·容器·mariadb
wyiyiyi10 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
天宇_任11 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
xiep143833351014 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
Java小白程序员15 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
老虎062715 小时前
数据库基础—SQL语句总结及在开发时
数据库·sql·oracle
爱掘金的土拨鼠17 小时前
国产化dm数据库锁表解锁
数据库