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 17 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
JS 获取滚动条高度示例代码
Oct 24 Javascript
利用Jquery实现可多选的下拉框
Feb 21 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
jQuery实现checkbox的简单操作
Nov 18 jQuery
vue实现的组件兄弟间通信功能示例
Dec 04 Javascript
Vue实现一个图片懒加载插件
Mar 11 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 Javascript
javascript递归函数定义和用法示例分析
Jul 22 Javascript
关于vue属性使用和不使用冒号的区别说明
Oct 22 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 VS ASP
2006/10/09 PHP
织梦模板标记简介
2007/03/11 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
JS重要知识点小结
2011/11/06 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
js实现一个简易计算器
2020/03/30 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
python学生信息管理系统
2018/03/13 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
python内存管理机制原理详解
2019/08/12 Python
Python3实现飞机大战游戏
2020/04/24 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
巴西手表购物网站:eclock
2019/03/19 全球购物
师范学院毕业生求职信范文
2013/12/26 职场文书
公司面试感谢信
2014/02/01 职场文书
消防先进事迹材料
2014/02/10 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
Python实现批量自动整理文件
2022/03/16 Python
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python