1. 程式人生 > 程式設計 >Vue 使用typescript如何優雅的呼叫swagger API

Vue 使用typescript如何優雅的呼叫swagger API

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內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!