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

embedded/2024/12/23 17:43:24/

1. 后端接口

1.接口实现

pip install fastapi
pip install uvicorn# api.py
from pydantic import BaseModel
from fastapi import FastAPI
import uvicorn
import os#  定义请求体模型
class Payload(BaseModel):key1: strkey2: 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文件即可。

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调用

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

import requestsurl = '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时,才能进行异步处理。


http://www.ppmy.cn/embedded/148126.html

相关文章

【数据结构】平衡二叉树

目录 一、概念 二、平衡二叉树的插入 (一)插入步骤 (二)旋转 1、左旋 2、右旋 3、左右双旋 4、右左双旋 三、特点 四、整体代码 一、概念 平衡二叉树是在二叉搜索树的改进,二叉搜索树详见:【数据结…

Linux系统加固

Linux系统安全加固 文章目录 Linux系统安全加固密码策略文件、目录安全未授权suid、未授权sgid排查与加固禁止root登录ftp、禁止匿名访问ftp计划任务排查与加固、开机自启排查与加固限定root用户远程ssh登录日志加固 无用账号、用户组和空口令账户排查与加固 禁用或删除无用账号…

【mysql】1205 -Lock wait timeout exceeded; try restarting transaction

问题: mysql8执行SQL提示下面错误: 1205 -Lock wait timeout exceeded; try restarting transaction 1205-超过锁定等待超时;尝试重新启动事务 可能的原因: 事务冲突:多个事务同时尝试修改同一行数据,导…

使用ElasticSearch实现全文检索

文章目录 全文检索任务描述技术难点任务目标实现过程1. java读取Json文件,并导入MySQL数据库中2. 利用Logstah完成MySQL到ES的数据同步3. 开始编写功能接口3.1 全文检索接口3.2 查询详情 4. 前端调用 全文检索 任务描述 在获取到数据之后如何在ES中进行数据建模&a…

设计模式の享元模板代理模式

文章目录 前言一、享元模式二、模板方法模式三、代理模式3.1、静态代理3.2、JDK动态代理3.3、Cglib动态代理3.4、小结 前言 本篇是关于设计模式中享元模式、模板模式、以及代理模式的学习笔记。 一、享元模式 享元模式是一种结构型设计模式,目的是为了相似对象的复用…

druid与pgsql结合踩坑记

最近项目里面突然出现一个怪问题,数据库是pgsql,jdbc连接池是alibaba开源的druid,idea里面直接启动没问题,打完包放在centos上和windows上cmd窗口都能直接用java -jar命令启动,但是放到国产信创系统上就是报错&#xf…

STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)

导言 Embedded IDE官网:https://em-ide.com/docs/intro 我猜肯定有部分人使用SI Keil开发STM32项目,也有vscode Keil开发STM32程序。SI或vscode编写代码,然后切换Keil编译、下载、调试程序。有一段时间,我也是这么干的。但是,程…

分布式系统架构:服务容错

1.为什么需要容错 分布式系统的本质是不可靠的,一个大的服务集群中,程序可能崩溃、节点可能宕机、网络可能中断,这些“意外情况”其实全部都在“意料之中”。故障的发生是必然的,所以需要设计一套健壮的容错机制来应对这些问题。 …