Vue 使用typescript, 优雅的调用swagger API

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,后端集成下Swagger,然后就可以提供一个在线文档地址给前端同学。

swagger

前端如何优雅的调用呢?

入门版#

根据文档,用axios自动来调用

Copy
// 应用管理相关接口 import axios from '../interceptors.js' // 获取应用列表 export const getList = (data) => { return axios({ url: '/app/list?sort=createdDate,desc', method: 'get', params: data }) }

这里的问题是,有多少个接口,你就要编写多少个函数,且数据结构需要查看文档获取。

进阶版本#

使用typescript,编写API,通过Type定义数据结构,进行约束。

问题: 还是需要手写

优雅版本#

swagger 其实是一个json-schema描述文档,我们可以基于此,自动生成。

很早之前,写过一个插件 generator-swagger-2-t, 简单的实现了将swagger生成typescript api。

今天,笔者对这个做了升级,方便支持后端返回的泛型数据结构。

安装#

需要同时安装 Yeoman 和 -swagger-2-ts

Copy
npm install -g generator-swagger-2-ts

然后cd到你的工作目录,执行:

Copy
yo swagger-2-ts

按提示

也可以通过命令行直接传递参数

Copy
yo swagger-2-ts --swaggerUrl=http://localhost:8080/swagger-ui.html --className=API --type=typescript --outputFile=api.ts
  • swaggerUrl: swagger ui url swaggerui地址
  • className: API class name 类名
  • type: typescript or javascipt
  • outputFile: api 文件保存路径

生成代码demo:#

Copy
export type AccountUserInfo = { disableTime?: string isDisable?: number lastLoginIp?: string lastLoginPlace?: string lastLoginTime?: string openId?: string } export type BasePayloadResponse = { data?: object desc?: string retcode?: string } /** * User Account Controller * @class UserAccountAPI */ export class UserAccountAPI { /** * changeUserState * @method * @name UserAccountAPI#changeUserState * @param accountUserInfo - accountUserInfo * @param $domain API域名,没有指定则使用构造函数指定的 */ changeUserState(parameters: { 'accountUserInfo': AccountUserInfo, $queryParameters?: any, $domain?: string }): Promise<AxiosResponse<BasePayloadResponse>> { let config: AxiosRequestConfig = { baseURL: parameters.$domain || this.$defaultDomain, url: '/userAccount/changeUserState', method: 'PUT' } config.headers = {} config.params = {} config.headers[ 'Accept' ] = '*/*' config.headers[ 'Content-Type' ] = 'application/json' config.data = parameters.accountUserInfo return axios.request(config) } _UserAccountAPI: UserAccountAPI = null; /** * 获取 User Account Controller API * return @class UserAccountAPI */ getUserAccountAPI(): UserAccountAPI { if (!this._UserAccountAPI) { this._UserAccountAPI = new UserAccountAPI(this.$defaultDomain) } return this._UserAccountAPI } } /** * 管理系统接口描述 * @class API */ export class API { /** * API构造函数 * @param domain API域名 */ constructor(domain?: string) { this.$defaultDomain = domain || 'http://localhost:8080' } }

使用#

Copy
import { API } from './http/api/manageApi' // in main.ts let api = new API("/api/") api.getUserAccountAPI().changeUserState({ isDisable: 1 openId: 'open id' })

Vue中最佳实践#

main.ts 全局定义#

Copy
import { API } from './http/api/manageApi' Vue.prototype.$manageApi = new API('/api/')

增加.d.ts#

增加types文件,方便使用智能提示

Copy
import { API } from '@/http/api/manageApi' import { MarkAPI } from '@/http/api/mark-center-api' declare module "vue/types/vue" { interface Vue { $manageApi: API $markApi: MarkAPI } }

实际使用#

现在可以在vue里直接调用了。

vscode调用

Copy
this.$manageApi .getUserAccountAPI().changeUserState({isDisable: 1openId: 'open id'})

开源地址#

https://github.com/jadepeng/generator-swagger-2-ts

欢迎star!


作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

关注作者

欢迎关注作者微信公众号, 一起交流软件开发:欢迎关注作者微信公众号

posted @   JadePeng  阅读(6401)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
CONTENTS