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 相关文章推荐
js 第二代身份证号码的验证机制代码
May 12 Javascript
纯JS实现的批量图片预览加载功能
Aug 14 Javascript
子页向父页传值示例
Nov 27 Javascript
js正则表达式匹配数字字母下划线等
Apr 14 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
Oct 17 Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 Javascript
js实现一个猜数字游戏
Mar 31 Javascript
JS数组的常用10种方法详解
May 08 Javascript
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
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
使用swoole扩展php websocket示例
2014/02/13 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
PHP 无限级分类
2017/05/04 PHP
JS获取父节点方法
2009/08/20 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
Python实现购物车功能的方法分析
2017/11/10 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
文明学生事迹材料
2014/01/29 职场文书
建筑安全标语
2014/06/07 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python