当前位置: 首页 > ds >正文

FastAPI系列16:从API文档到TypeScript 前端客户端(SDKs)

从API文档到TypeScript 前端客户端(SDKs)

    • 快速入门
      • 生成一个TypeScript 客户端
      • 测试生成的TypeScript 客户端
    • API标签与客户端生成
      • 生成带有标签的 TypeScript 客户端
    • 自定义Operation ID
      • 使用自定义Operation ID生成TypeScript客户端


在 FastAPI系列15:API文档的定制和美化 一节中,我们讲解了如何定制和美化API文档,一个良好的API文档可以过千言万语的沟通,同时也能让你立刻收获一个结构良好的客户端框架。本节我们介绍如何使用openapi-ts为你的API生成一个TypeScript 前端客户端。

我们知道FastAPI是基于OpenAPI规范的,这就意味着我们可以使用一些工具来为不同的编程语言生成客户端(SDKs),如:

  • OpenAPI Generator
  • openapi-ts

快速入门

我们有一个简单的 FastAPI 应用:

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatclass ResponseMessage(BaseModel):message: str@app.post("/items/", response_model=ResponseMessage)
async def create_item(item: Item):return {"message": "item received"}@app.get("/items/", response_model=list[Item])
async def get_items():return [{"name": "Plumbus", "price": 3},{"name": "Portal Gun", "price": 9001},]

生成一个TypeScript 客户端

安装 openapi-ts

npm install @hey-api/openapi-ts --save-dev

生成客户端代码
配置好package.json

{"name": "frontend-app","version": "1.0.0","description": "","main": "index.js","scripts": {"generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios"},"author": "","license": "","devDependencies": {"@hey-api/openapi-ts": "^0.27.38","typescript": "^4.6.2"}
}

运行generate-client脚本

npm run generate-client

这时我们就可以在./src/client中获得生成的代码。

测试生成的TypeScript 客户端

现在我们可以导入并使用客户端代码:
在这里插入图片描述
我们可以方便地在客户端代码中使用自动补全
在这里插入图片描述

API标签与客户端生成

在复杂一些的情况下,我们会使用标签来分隔不同组的路由,如下列代码情形:

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatclass ResponseMessage(BaseModel):message: strclass User(BaseModel):username: stremail: str@app.post("/items/", response_model=ResponseMessage, tags=["items"])
async def create_item(item: Item):return {"message": "Item received"}@app.get("/items/", response_model=list[Item], tags=["items"])
async def get_items():return [{"name": "Plumbus", "price": 3},{"name": "Portal Gun", "price": 9001},]@app.post("/users/", response_model=ResponseMessage, tags=["users"])
async def create_user(user: User):return {"message": "User received"}

生成带有标签的 TypeScript 客户端

当我们重新执行generate-client脚本,它会根据tags为我们生成两个service:ItemsService、UserService。
在这里插入图片描述

自定义Operation ID

在生成的代码中,类似于createItemItemsPost这样的方法名看起来不太简洁,这是因为OpenAPI要求每个Operation ID 都是唯一的,所以FastAPI会默认使用函数名路径HTTP方法/操作来生成Operation ID。
当然,我们也是可以通过自定义函数来修改这些Operation ID的生成方式。这个自定义函数要求接受一个 APIRoute 对象作为参数,结果输出一个字符串作为Operation ID:

from fastapi import FastAPI
from fastapi.routing import APIRoute
from pydantic import BaseModeldef custom_generate_unique_id(route: APIRoute):return f"{route.tags[0]}-{route.name}"app = FastAPI(generate_unique_id_function=custom_generate_unique_id)class Item(BaseModel):name: strprice: floatclass ResponseMessage(BaseModel):message: strclass User(BaseModel):username: stremail: str@app.post("/items/", response_model=ResponseMessage, tags=["items"])
async def create_item(item: Item):return {"message": "Item received"}@app.get("/items/", response_model=list[Item], tags=["items"])
async def get_items():return [{"name": "Plumbus", "price": 3},{"name": "Portal Gun", "price": 9001},]@app.post("/users/", response_model=ResponseMessage, tags=["users"])
async def create_user(user: User):return {"message": "User received"}

使用自定义Operation ID生成TypeScript客户端

现在再次生成客户端,我们就可以获得更好的方法名了:
在这里插入图片描述

http://www.xdnf.cn/news/6364.html

相关文章:

  • 3天重庆和成都旅游规划
  • 【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级
  • acwing 4275. Dijkstra序列
  • 二叉树复习(C语言版)
  • 国标GB28181视频平台EasyGBS打造交通道路/停车场/公共场所违章视频监控解决方案
  • keil编译时报错:error:Could not open file .\***\core_cm3.o(最有用的方法没有之一!!!)
  • 代码随想录算法训练营第三十九天(打家劫舍专题) | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III
  • Windows更新暂停七天关键注册表
  • 无人机箱号识别系统结合5G技术的应用实践
  • 数字IC后端零基础入门基础理论(Day2)
  • AD 间距规则与布线规则
  • GaussDB 实例 gsql 连接方式详解
  • 在python中使用Json提取数据
  • [思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?
  • 第五部分:第三节 - Express.js 框架入门:厨房的流程管理系统
  • 力扣-102.二叉树的层序遍历
  • 在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1
  • c++和c的不同
  • 【复刻】人工智能技术应用如何影响企业创新(2007-2023年)
  • 鸿蒙Next API17学习新特性之组件可见区域变化事件新增支持设置事件的回调参数,限制它的执行间隔
  • MATLAB 中常用的微分函数介绍
  • Redis的热Key问题如何解决?
  • 信息化项目绩效管理办法V5.0
  • 一篇解决Redis:持久化机制
  • 天拓四方盛装亮相第二十七届中国北京国际科技产业博览会
  • 未来软件开发趋势与挑战
  • 深入理解ThingsBoard的Actor模型
  • 基于Swim Transformer的脑癌MRI图像智能辅助诊断模型
  • Vue 图片预览功能(含缩略图)
  • 【Redis】集群