Vue 使用typescript如何优雅的调用swagger API


Posted in Javascript onSeptember 01, 2020

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

Vue 使用typescript如何优雅的调用swagger API

前端如何优雅的调用呢?

入门版

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

// 应用管理相关接口
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

npm install -g generator-swagger-2-ts

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

yo swagger-2-ts

按提示

  • 输入swagger-ui 地址,例如http://192.168.86.8:8051/swagger-ui.html
  • 可选生成js 或者 typescript
  • 可以自定义生成的api class名称、api文件名
  • API 支持泛型

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

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:

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'
 }
}

使用

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 全局定义

import { API } from './http/api/manageApi'

Vue.prototype.$manageApi = new API('/api/')

增加.d.ts

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

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里直接调用了。

Vue 使用typescript如何优雅的调用swagger API

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

开源地址

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

总结

到此这篇关于Vue 使用typescript如何优雅的调用swagger API的文章就介绍到这了,更多相关Vue 使用typescript内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript XML数据显示为HTML一例
Dec 23 Javascript
js 可拖动列表实现代码
Dec 13 Javascript
禁用页面部分JavaScript方法的具体实现
Jul 31 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
Oct 30 Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 Javascript
微信小程序 video组件详解
Oct 25 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
Gulp实现静态网页模块化的方法详解
Jan 09 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
JavaScript如何把两个数组对象合并过程解析
Oct 10 Javascript
Element Dialog对话框的使用示例
Jul 26 Javascript
vue路由切换时取消之前的所有请求操作
Sep 01 #Javascript
jQuery实现动态加载瀑布流
Sep 01 #jQuery
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 #Javascript
vue treeselect获取当前选中项的label实例
Aug 31 #Javascript
vue 监听 Treeselect 选择项的改变操作
Aug 31 #Javascript
搭建vscode+vue环境的详细教程
Aug 31 #Javascript
vue组件中实现嵌套子组件案例
Aug 31 #Javascript
You might like
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
jquery()函数的三种语法介绍
2013/10/09 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
数字漫画:comiXology
2020/06/13 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
医药营销个人求职信
2014/04/12 职场文书
车辆转让协议书
2014/04/15 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
学校工会工作总结2015
2015/05/19 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
Mysql 文件配置解析介绍
2022/05/06 MySQL