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 相关文章推荐
jquery 插件开发方法小结
Oct 23 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
如何判断鼠标是否在DIV的区域内
Nov 13 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
js实现选中复选框文字变色的方法
Aug 14 Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 Javascript
JS实现类似51job上的地区选择效果示例
Nov 17 Javascript
Angular6 正则表达式允许输入部分中文字符
Sep 10 Javascript
浅谈Vue数据响应
Nov 05 Javascript
js实现登录时记住密码的方法分析
Apr 05 Javascript
微信小程序实现弹框效果
May 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
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
java必学必会之static关键字
2015/12/03 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
React简单介绍
2017/05/24 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python中属性和描述符的正确使用
2016/08/23 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
python的socket编程入门
2018/01/29 Python
Python iter()函数用法实例分析
2018/03/17 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
Python函数基本使用原理详解
2020/03/19 Python
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
Android面试题附答案
2014/12/08 面试题
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
中专毕业自我鉴定
2013/10/16 职场文书
护理专业应届毕业生推荐信
2013/11/15 职场文书
《雪儿》教学反思
2014/04/17 职场文书
企业形象策划方案
2014/05/29 职场文书
简历中自我评价范文
2015/03/11 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
团干部培训班心得体会
2016/01/06 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸