fastAPI接口的请求与响应——基础

1. 后端接口

1.接口实现

python 复制代码
pip install fastapi
pip install uvicorn

# api.py
from pydantic import BaseModel
from fastapi import FastAPI
import uvicorn
import os


#  定义请求体模型
class Payload(BaseModel):
    key1: str
    key2: str


# 创建一个FastAPI应用程序实例
app = FastAPI()

# 定义路由(使用装饰器将函数绑定到特定的路径和HTTP方法)
@app.get("/")
async def root():
    return {"message": "Hello World"}

## get对于多个请求参数:
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

## post对于多个请求参数:
@app.post("/api")
async def handle_post_request(payload: Payload):
    return {"message": f"Received key1: {payload.key1} and key2: {payload.key2}"}
    

代码解析:

1) @app.get和@app.post为两种不同的请求方法

2) BaseModel 是 Pydantic 库中的一个类,它被用于创建数据模型,用于解析和验证数据。在 FastAPI 中,BaseModel 经常用于定义请求体的结构,确保传入的数据符合预期的格式 。Pydantic 模型提供了声明式的数据验证,这意味着你可以在模型类中定义属性及其类型,Pydantic 将自动执行验证。如果传入的数据不符合模型定义的规则,Pydantic 将抛出异常。

3) 在这个例子中,Payload 类有两个属性:key1 和 key2,它们都被声明为字符串类型 (str)。当 FastAPI 接收到一个 HTTP 请求时,它会尝试将请求体中的 JSON 数据解析为这个模型如果请求体中的 JSON 数据符合这个模型的定义(即有 key1 和 key2 属性,并且它们都是字符串类型),那么这个请求就会被成功解析。否则,FastAPI 会返回一个错误响应,说明哪些字段不符合预期

2.接口启动
方式一:uvicorn 内嵌式

在上述代码所在的api.pi中加入以下代码后,运行api.py文件即可。

python 复制代码
if __name__ == "__main__":
	uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("API_PORT", 8000)), workers=1)

方式二:uvicorn 外启式

在命令行输入命令:uvicorn api:app --host 0.0.0.0 --port 8000 --reload

main:启动服务的py文件名

app:服务对象名(FastAPI创建的对象)

---host:ip地址

---port:端口

---reload:代码修改后自动重启服务。仅在开发时使用,上线后不要带这个参数,会降低性能

2.API调用

注意:后端代码此时都是非流式输出,所以访问时只需要处理非流式响应即可。

bash 复制代码
import requests

url = 'http://localhost:8000/api'  # 假设你的应用运行在本地8000端口
payload = {'key1': 'value1', 'key2': 'value2'}

# 请求方式1:
response = requests.post(url, json=payload)
print(response.json())

# 请求方式2:推荐该请求方式
'''
确保了资源的正确初始化和清理,特别是在异常发生的情况下。具体来说,with 语句提供了一种简洁的方式,可以自动处理资源的获取和释放,这对于流式响应尤为重要。
1. 自动关闭连接:当你使用 with 语句时,一旦代码块结束,Python 会自动调用 r.close() 来关闭请求连接。这对于流式响应尤为重要,因为如果不显式关闭连接,可能会导致连接池中的连接无法被释放,从而影响性能或导致资源泄漏5。
2. 异常安全:即使在处理流式响应的过程中发生了异常,with 语句也会确保连接被正确关闭。这有助于防止未处理的异常导致连接保持打开状态,进而消耗不必要的资源6。
3. 代码清晰性:使用 with 语句可以使代码更加简洁和易读。它明确地表明了资源的生命周期,并且减少了手动管理资源的需求,降低了出错的可能性。
'''
# with requests.post(url, json=payload) as r:
#     r.raise_for_status()  # 检查请求是否成功
#     print(r.json())

3.注意

api的接口函数如果没有async修饰就是同步函数。如果有async修饰,但内部没有await修饰,那么其实也还是同步函数;有await时,才能进行异步处理。

相关推荐
小屁不止是运维2 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
maimang093 小时前
关于UDP缓冲区和丢包统计
网络
tjjingpan4 小时前
HCIA-Access V2.5_4_2_静态路由介绍
网络
黑客K-ing4 小时前
网络安全防范
linux·服务器·web安全
老大白菜5 小时前
FastAPI vs Go 性能对比分析
开发语言·golang·fastapi
这题怎么做?!?5 小时前
ARP协议及其具体过程
运维·服务器·网络
无线认证x英利检测5 小时前
进网许可认证、交换路由设备检测项目更新25年1月起
网络·智能路由器
路飞雪吖~5 小时前
【Linux】进程控制
linux·运维·服务器
昌sit!5 小时前
监控IP频繁登录服务器脚本
服务器·网络·tcp/ip