Skip to content
On this page

openapi-ts-request

简介

openapi-ts-request 是一个用于从 OpenAPI 规范生成 TypeScript 类型安全的 API 请求客户端的库。它可以自动生成与后端 API 交互的类型定义和请求函数,确保前端代码与 API 规范保持同步,并提供完整的类型检查和自动补全功能。

安装

bash
npm install openapi-ts-request --save-dev

基本使用

配置生成器

typescript
// openapi-config.ts
import { generateApi } from 'openapi-ts-request'

// 从本地文件生成
generateApi({
  input: './openapi.json', // OpenAPI 规范文件路径
  output: './src/api', // 生成的 API 客户端输出目录
  httpClient: 'axios', // 使用的 HTTP 客户端,支持 axios、fetch 等
})

// 或从远程 URL 生成
generateApi({
  input: 'https://api.example.com/openapi.json',
  output: './src/api',
  httpClient: 'axios',
})

使用生成的 API 客户端

typescript
// 导入生成的 API 客户端
import { api } from './src/api'

// 使用生成的类型安全的 API 函数
async function fetchUsers() {
  try {
    // 完全类型安全的 API 调用
    const users = await api.users.getUsers()
    console.log(users.data)

    // 带参数的 API 调用
    const user = await api.users.getUserById({ pathParams: { id: 1 } })
    console.log(user.data)

    // 带查询参数的 API 调用
    const filteredUsers = await api.users.getUsers({
      queryParams: { role: 'admin', status: 'active' },
    })
    console.log(filteredUsers.data)

    // 带请求体的 API 调用
    const newUser = await api.users.createUser({
      body: { name: 'John Doe', email: 'john@example.com' },
    })
    console.log(newUser.data)
  } catch (error) {
    console.error('API 请求失败:', error)
  }
}

高级配置

自定义 HTTP 客户端

typescript
import { generateApi } from 'openapi-ts-request'
import axios from 'axios'

// 创建自定义 axios 实例
const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${localStorage.getItem('token')}`,
  },
})

// 添加请求拦截器
axiosInstance.interceptors.request.use(
  (config) => {
    // 在发送请求前做些什么
    console.log('请求发送:', config)
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 添加响应拦截器
axiosInstance.interceptors.response.use(
  (response) => {
    // 对响应数据做些什么
    return response
  },
  (error) => {
    // 对响应错误做些什么
    if (error.response && error.response.status === 401) {
      // 处理未授权错误
      console.log('未授权,请重新登录')
    }
    return Promise.reject(error)
  },
)

// 在生成 API 时使用自定义 HTTP 客户端
generateApi({
  input: './openapi.json',
  output: './src/api',
  httpClient: {
    type: 'axios',
    instance: 'axiosInstance', // 使用自定义的 axios 实例
    importPath: '../utils/axios-instance', // 导入路径
  },
})

生成选项配置

typescript
import { generateApi } from 'openapi-ts-request'

generateApi({
  input: './openapi.json',
  output: './src/api',
  httpClient: 'axios',
  options: {
    // 生成的模块类型 (esm 或 cjs)
    moduleType: 'esm',

    // 是否生成请求和响应类型
    generateTypes: true,

    // 是否生成请求和响应示例
    generateExamples: true,

    // 是否生成 API 文档注释
    generateDocs: true,

    // 自定义类型映射
    typeMapping: {
      // 将 OpenAPI 的 integer 类型映射为 TypeScript 的 number 类型
      integer: 'number',

      // 将 OpenAPI 的 string:date 格式映射为自定义 Date 类型
      'string:date': 'Date',

      // 将 OpenAPI 的 string:date-time 格式映射为自定义 DateTime 类型
      'string:date-time': 'DateTime',
    },

    // 自定义操作 ID 生成
    operationIdTransform: (operationId, path, method) => {
      // 自定义操作 ID 转换逻辑
      return operationId.toLowerCase()
    },
  },
})

与前端框架集成

在 Vue 项目中使用

typescript
// api.ts
import { api } from './src/api'

// UserService.ts
import { ref, Ref } from 'vue'
import { api } from '../api'
import type { User } from '../api/models'

export function useUsers() {
  const users: Ref<User[]> = ref([])
  const loading = ref(false)
  const error = ref(null)

  const fetchUsers = async () => {
    loading.value = true
    error.value = null

    try {
      const response = await api.users.getUsers()
      users.value = response.data
    } catch (err) {
      error.value = err
      console.error('获取用户失败:', err)
    } finally {
      loading.value = false
    }
  }

  return {
    users,
    loading,
    error,
    fetchUsers,
  }
}

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命