1.0.6 • Published 1 month ago

openapi-request v1.0.6

Weekly downloads
-
License
MIT
Repository
github
Last release
1 month ago

介绍

npm (scoped)

根据 OpenApi2 | OpenApi3 文档快速生成 request 请求代码,默认生成使用的请求库axios,也可使用自定义请求方法。

使用

  1. 安装
    npm i --save-dev openapi-request openapi-typescript-helpers
  2. 在项目根目录新建 openapi.config.ts

    const { generateRequest } = require('openapi-request')
    
    generateRequest({
        // Swagger 2.0 或 OpenAPI 3.0 的请求地址或本地路径
        schemaPath: 'http://petstore.swagger.io/v2/swagger.json',
        // 生成的文件夹的路径
        serversPath: './servers',
        // 项目名称,如果有将在 serversPath 下创建文件夹,适用于一个项目有多个请求服务
        projectName: "swagger",
        // 自定义导出的接口名称
        exportName: 'api',
        // hook 示例
        hook:{
            // 自定义请求函数名称,目录名称
            customName({path,method,definition},defaultName){
                if(path==="/test/test"){
                    // 返回false,不生成该接口
                    return false;
                }
                if (path === '/system/menu/list') {
                    return {folder:"system",name:"getMenuList"};
                }
                return defaultName;
            }
        }
    })
  3. 执行命令生成请求方法 在 package.jsonscript 中添加 api: "openapi":"ts-node openapi.config.ts",

    执行命令生成api

    npm run openapi
  4. 示例参考 https://github.com/c2node/openapi-request/tree/main/test

自定义请求方法

当使用axios外的请求库或需要对axios请求方法进行扩展可自定义请求方法进行实现 1. 请求方法参数说明 请求方法默认接受2个参数,参数2和其他参数可通过requestFnOtherParams进行配置,需要注意的是:除参数1外,都是可选参数

  • 参数1:OpenapiRequestConfig

    export interface OpenapiRequestConfig {
        url: string,
        method: string,
        // 是否允许跨站点提交请求,携带Cookie需要
        withCredentials?:bool,
        // header参数,其中content-type为body编码类型
        headers?: Record<string, string>,
        // 请求查询参数
        params?: Record<string, any>,
        // body参数
        data?: Record<string, any> | FormData,
        // 响应类型
        responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream',
    }
  • 参数2 option?:Omit<axios.AxiosRequestConfig,"url"|"method">

  1. fetch 请求示例
    1. src/fetch-request.ts
    import {OpenapiRequestConfig} from "openapi-request/types";

const baseUrl = 'http://127.0.0.1:8080'; export type RequestOption = Omit<RequestInit, 'body'>;

export function request(config: OpenapiRequestConfig, { headers: _headers = {}, ...option }: RequestOption = {}) { const { url, method, params = {}, headers = {}, data, responseType, withCredentials = false } = config; const urlData = new URL(url, baseUrl); urlData.searchParams let body switch (headers'content-type') { case 'multipart/form-data': { body = new FormData(); Object.keys(data).forEach(key => { body.append(key, datakey); }); break; } case 'application/json': { body = JSON.stringify(data); break; } default: { // application/x-www-form-urlencoded 或其它格式 body = new URLSearchParams(Object.entries(data)).toString(); break; } } Object.keys(params ?? {}).forEach(key => { urlData.searchParams.append(key, paramskey); }); return fetch(urlData, { method, headers: {...headers, ..._headers}, body, ...option, credentials: withCredentials ? 'include' : undefined, }).then(res => { if (responseType === 'json') { return res.json() as Response } return res.text() as Response; }) }

1. `openapi.config.ts`
```ts
    const { generateService } = require('openapi-request')
    await generateService({
        // 导入自定义请求方法
        requestImport: "import {request,RequestOption} from \"src/fetch-request\"",
        // 自定义请求方法名称
        requestFnName: "request",
        // 自定义请求方法其他可选参数
        requestFnOtherParams: [{name: "option", type: "RequestOption"}],
        // Swagger 2.0 或 OpenAPI 3.0 的请求地址或本地路径
        schemaPath: 'http://petstore.swagger.io/v2/swagger.json',
        // 生成的文件夹的路径
        serversPath: './service-files',
        // 项目名称,如果有将在 serversPath 下创建文件夹,适用于一个项目有多个请求服务
        projectName: "swagger-fetch",
        // hook 示例
        hook: {
            // 自定义请求函数名称,目录名称
            customName({path, method, definition}, defaultName) {
                if (path === "/store/inventory") {
                    return false;
                }
                if (path === '/user/{username}' && method === "get") {
                    return {folder: "system", name: "userInfo"};
                }
                return defaultName;
            }
        }
    });
  1. 生成代码参照 https://github.com/c2node/openapi-request/tree/main/test/service-files/swagger-fetch

参数

属性必填备注类型默认值
requestImport导入自定义请求方法stringimport axios from "axios"
requestFnName自定义请求方法名称stringaxios.request
requestParams生产的请求方法Params包含的参数Record<'path' | 'query' | 'header' | 'cookie', boolean>{path:true,query:true,header:true,cookie:true}
requestFnOtherParams自定义请求方法其它可选参数{ name: string, type: string }[][]
serversPath生成的文件夹的路径string-
schemaPathSwagger 2.0 或 OpenAPI 3.0 的请求地址或本地路径string-
projectName项目名称,如果有将在 serversPath 下创建文件夹string-
exportName导出的api名称string--
exportJson导出JSON文件boolean | {openapi:boolean,service:boolean }--
templatesFolder自定义模板文件的文件路径string-
hook.customName自定义请求函数名称,目录名称{name:"函数名称",folder:"目录名称"}-
hook.customRequestParams自定义请求方法params参数,参数中如需排除该参数请返回 falseboolean--