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 相关文章推荐
csdn 博客中实现运行代码功能实现
Aug 29 Javascript
javascript 文章截取部分无损html显示实现代码
May 04 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
js中top的作用深入剖析
Mar 04 Javascript
javascript检查浏览器是否支持flash的实现代码
Aug 14 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
jquery 实现复选框的全选操作实例代码
Jan 24 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
ES6扩展运算符用法实例分析
Oct 31 Javascript
非常漂亮的js烟花效果
Mar 10 Javascript
用vue设计一个日历表
Dec 03 Vue.js
uniapp开发打包多端应用完整方法指南
Dec 24 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与已存在的Java应用程序集成
2006/10/09 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
python实现爬虫下载美女图片
2015/07/14 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
使用python绘制二维图形示例
2019/11/22 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
耐克美国官网:Nike.com
2016/08/01 全球购物
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
工程力学硕士生的自我评价范文
2013/11/16 职场文书
平面设计岗位职责
2013/12/14 职场文书
设计顾问服务计划书
2014/05/04 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
股指期货心得体会
2014/09/10 职场文书
技能培训通讯稿
2015/07/18 职场文书
DSP接收机前端设想
2022/04/05 无线电
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS