首页 >> js开发 >> jsVue 使用typescript如何优雅的调用swagger APIjs大全
jsVue 使用typescript如何优雅的调用swagger APIjs大全
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,后端集成下Swagger,然后就可以提供一个在线文档地址给前端同学。前端如何优雅的调用呢?入门版入门版入门版根据文档,用axios自动来调用
// 应用管理相关接口
import axios from '../interceptors.js'
// 获取应用列表
export const getList = (data) => {
return axios({
url: '/app/list?sort=createdDate,desc',
method: 'get',
params: data
})
}
// 应用管理相关接口
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。generator-swagger-2-t今天,笔者对这个做了升级,方便支持后端返回的泛型数据结构。安装需要同时安装 Yeoman 和 -swagger-2-tsYeoman
npm install -g generator-swagger-2-ts
npm install -g generator-swagger-2-ts然后cd到你的工作目录,执行:
yo swagger-2-ts
yo swagger-2-ts按提示
输入swagger-ui 地址,例如http://192.168.86.8:8051/swagger-ui.html
可选生成js 或者 typescript
可以自定义生成的api class名称、api文件名
API 支持泛型
输入swagger-ui 地址,例如http://192.168.86.8:8051/swagger-ui.htmlhttp://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
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 文件保存路径
swaggerUrl: swagger ui url swaggerui地址className: API class name 类名type: typescript or javasciptoutputFile: 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> {
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'
}
}
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> {
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'
})
import { API } from './http/api/manageApi'
// in main.ts
let api = new API("/api/")
api.getUserAccountAPI().changeUserState({
isDisable: 1
openId: 'open id'
})Vue中最佳实践Vue中最佳实践Vue中最佳实践main.ts 全局定义
import { API } from './http/api/manageApi'
Vue.prototype.$manageApi = new API('/api/')
import { API } from './http/api/manageApi'
Vue.prototype.$manageApi = new API('/api/')增加.d.ts增加.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
}
}
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里直接调用了。
this.$manageApi
.getUserAccountAPI().changeUserState({isDisable: 1, openId: 'open id'})
this.$manageApi
.getUserAccountAPI().changeUserState({isDisable: 1, openId: 'open id'})开源地址https://github.com/jadepeng/generator-swagger-2-tshttps://github.com/jadepeng/generator-swagger-2-ts总结总结总结
// 应用管理相关接口
import axios from '../interceptors.js'
// 获取应用列表
export const getList = (data) => {
return axios({
url: '/app/list?sort=createdDate,desc',
method: 'get',
params: data
})
}
// 应用管理相关接口
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。generator-swagger-2-t今天,笔者对这个做了升级,方便支持后端返回的泛型数据结构。安装需要同时安装 Yeoman 和 -swagger-2-tsYeoman
npm install -g generator-swagger-2-ts
npm install -g generator-swagger-2-ts然后cd到你的工作目录,执行:
yo swagger-2-ts
yo swagger-2-ts按提示
输入swagger-ui 地址,例如http://192.168.86.8:8051/swagger-ui.html
可选生成js 或者 typescript
可以自定义生成的api class名称、api文件名
API 支持泛型
输入swagger-ui 地址,例如http://192.168.86.8:8051/swagger-ui.htmlhttp://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
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 文件保存路径
swaggerUrl: swagger ui url swaggerui地址className: API class name 类名type: typescript or javasciptoutputFile: 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
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'
}
}
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
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'
})
import { API } from './http/api/manageApi'
// in main.ts
let api = new API("/api/")
api.getUserAccountAPI().changeUserState({
isDisable: 1
openId: 'open id'
})Vue中最佳实践Vue中最佳实践Vue中最佳实践main.ts 全局定义
import { API } from './http/api/manageApi'
Vue.prototype.$manageApi = new API('/api/')
import { API } from './http/api/manageApi'
Vue.prototype.$manageApi = new API('/api/')增加.d.ts增加.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
}
}
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里直接调用了。
this.$manageApi
.getUserAccountAPI().changeUserState({isDisable: 1, openId: 'open id'})
this.$manageApi
.getUserAccountAPI().changeUserState({isDisable: 1, openId: 'open id'})开源地址https://github.com/jadepeng/generator-swagger-2-tshttps://github.com/jadepeng/generator-swagger-2-ts总结总结总结
相关文章:
- JavaScriptnodejs中内置模块fs,path常见的用法说明
- JavaScriptnuxt.js添加环境变量,区分项目打包环境操作
- JavaScriptNuxt.js nuxt-link与router-link的区别说明
- jsVue路由权限控制解析js大全
- js详解Vue中的watch和computedjs大全
- js你不知道的SpringBoot与Vue部署解决方案js大全
- jsvue 避免变量赋值后双向绑定的操作js大全
- js解决vue 使用axios.all()方法发起多个请求控制台报错的问题js大全
- jsaxios解决高并发的方法:axios.all()与axios.spread()的操作js大全
- jsWebpack的Loader和Plugin的区别js大全