一、什么是 Swagger OpenAPI 規(guī)范?

首先,我們要理解 Swagger 和 OpenAPI 規(guī)范的基本概念,因?yàn)樗鼈兪俏覀兩?TypeScript 類型的核心。

1. Swagger/OpenAPI 規(guī)范簡(jiǎn)介

Swagger 是一個(gè)開源框架,它幫助開發(fā)者設(shè)計(jì)、構(gòu)建、文檔化和使用 RESTful APIs。隨著 OpenAPI 規(guī)范(OAS)的發(fā)布,Swagger 成為了這個(gè)規(guī)范的實(shí)施工具之一。OpenAPI 規(guī)范通過(guò)一個(gè) JSON 或 YAML 文件來(lái)描述一個(gè) API 的詳細(xì)信息,包括請(qǐng)求方式(GET、POST 等)、路徑、參數(shù)、響應(yīng)類型等。

OpenAPI 規(guī)范的核心目的是通過(guò)機(jī)器可讀的格式,使得開發(fā)者可以自動(dòng)化地生成文檔、客戶端代碼和服務(wù)器端代碼。它不再局限于靜態(tài)的文檔展示,而是一個(gè)真正的交互式 API 規(guī)范。

舉個(gè)例子,假如你有一個(gè)如下的 API 文檔(Swagger 格式):

openapi:?3.0.0
info:
??title:?Example?API
??version:?1.0.0
paths:
??/users:
????get:
??????summary:?Returns?a?list?of?users
??????responses:
????????'200':
??????????description:?A?list?of?users
??????????content:
????????????application/json:
??????????????schema:
????????????????type:?array
????????????????items:
??????????????????type:?object
??????????????????properties:
????????????????????id:
??????????????????????type:?integer
????????????????????name:
??????????????????????type:?string

這個(gè)文檔描述了一個(gè)簡(jiǎn)單的 API?/users,它是一個(gè)?GET?請(qǐng)求,返回一個(gè)包含用戶信息的 JSON 數(shù)組。


二、TypeScript 與 OpenAPI 的結(jié)合:自動(dòng)生成類型

通過(guò)將 OpenAPI 規(guī)范與 TypeScript 結(jié)合,開發(fā)者可以從 API 文檔自動(dòng)生成接口定義、請(qǐng)求參數(shù)、響應(yīng)類型等,從而使 API 的使用更簡(jiǎn)單、規(guī)范,并且減少了手動(dòng)編寫類型的工作量。你不再需要每次修改 API 時(shí)手動(dòng)更新 TypeScript 類型,所有的類型和文檔都可以同步更新。

1. 需要的工具

我們需要以下工具來(lái)實(shí)現(xiàn) OpenAPI 到 TypeScript 類型的生成:

2. 安裝 OpenAPI Generator

首先,安裝 OpenAPI Generator。這個(gè)工具可以從 OpenAPI 規(guī)范自動(dòng)生成代碼和類型。

你可以通過(guò) npm 或 yarn 安裝它:npm install @openapitools/openapi-generator-cli -g

或者通過(guò) Homebrew 安裝:brew install openapi-generator

3. 生成 TypeScript 類型

接下來(lái),我們使用?openapi-generator?從 Swagger/OpenAPI 規(guī)范生成 TypeScript 類型。假設(shè)我們已經(jīng)有一個(gè)?swagger.yaml?文件,表示了 API 的定義。我們可以運(yùn)行以下命令來(lái)生成 TypeScript 類型:

openapi-generator-cli?generate?-i?swagger.yaml?-g?typescript-fetch?-o?./generated

解釋一下這個(gè)命令:

執(zhí)行這個(gè)命令后,./generated 文件夾下會(huì)生成 TypeScript 類型定義文件、API 客戶端代碼、請(qǐng)求方法等。我們可以直接在 TypeScript 項(xiàng)目中使用這些文件。


三、理解生成的 TypeScript 類型

在生成 TypeScript 類型后,你會(huì)看到類似這樣的代碼結(jié)構(gòu):

1. API 客戶端代碼

在?generated?文件夾中,生成的?ApiClient.ts?會(huì)包含所有的請(qǐng)求方法,例如:

export?class?UsersApi?{
??private?apiClient:?ApiClient;

??constructor(apiClient:?ApiClient)?{
????this.apiClient?=?apiClient;
??}

??public?async?getUsers():?Promise<User[]>?{
????const?response?=?await?this.apiClient.get('/users');
????return?response.data;
??}
}

在這個(gè)例子中,我們看到?UsersApi?類的?getUsers?方法,它調(diào)用了?apiClient.get('/users')?來(lái)發(fā)起 GET 請(qǐng)求。apiClient?是一個(gè)自動(dòng)生成的 API 客戶端類,它會(huì)處理 HTTP 請(qǐng)求和響應(yīng)。

2. TypeScript 類型

生成的 TypeScript 類型也會(huì)包括請(qǐng)求和響應(yīng)的定義:

export?type?User?=?{
??id:?number;
??name:?string;
};

export?type?ApiResponse<T>?=?{
??data:?T;
??status:?number;
??message:?string;
};

這些類型使得我們可以更精確地管理 API 請(qǐng)求和響應(yīng)的數(shù)據(jù)結(jié)構(gòu),并且通過(guò) TypeScript 的類型檢查,確保我們的 API 調(diào)用和數(shù)據(jù)處理更加可靠。


四、集成到 Vue 項(xiàng)目中

現(xiàn)在,我們已經(jīng)生成了 API 客戶端和相關(guān)類型,接下來(lái)將其集成到一個(gè) Vue 3 + TypeScript 項(xiàng)目中。假設(shè)我們?cè)?Vue 3 項(xiàng)目中需要獲取用戶列表并展示。

1. 安裝依賴

首先,確保你已經(jīng)安裝了?axios?或?fetch?作為 HTTP 請(qǐng)求庫(kù)。你可以選擇使用?axios,因?yàn)樗`活且易于使用。npm?install?axios

2. 使用生成的 API 客戶端

然后,在 Vue 組件中,導(dǎo)入生成的 API 客戶端,并使用它來(lái)調(diào)用 API。

<template>
??<div>
????<h1>Users?List</h1>
????<ul>
??????<li?v-for="user?in?users"?:key="user.id">{{?user.name?}}</li>
????</ul>
??</div>
</template>

<script?lang="ts">
import?{?defineComponent,?ref,?onMounted?}?from?'vue';
import?{?UsersApi?}?from?'./generated/ApiClient';
import?{?User?}?from?'./generated/Types';

export?default?defineComponent({
??name:?'UsersList',
??setup()?{
????const?users?=?ref<User[]>([]);

????const?usersApi?=?new?UsersApi(new?ApiClient());

????const?fetchUsers?=?async?()?=>?{
??????try?{
????????const?userList?=?await?usersApi.getUsers();
????????users.value?=?userList;
??????}?catch?(error)?{
????????console.error('Error?fetching?users:',?error);
??????}
????};

????onMounted(()?=>?{
??????fetchUsers();
????});

????return?{
??????users
????};
??}
});
</script>

在這個(gè)例子中,我們通過(guò) UsersApi 獲取用戶列表,并將其顯示在頁(yè)面上。這里的關(guān)鍵點(diǎn)是,TypeScript 類型系統(tǒng)幫助我們?cè)诰帉?API 調(diào)用時(shí)確保請(qǐng)求和響應(yīng)的數(shù)據(jù)結(jié)構(gòu)正確。


五、結(jié)論

通過(guò)將 OpenAPI 規(guī)范與 TypeScript 結(jié)合,我們能夠自動(dòng)化生成 API 客戶端代碼和類型定義,這不僅提高了開發(fā)效率,還減少了錯(cuò)誤的發(fā)生。

整個(gè)過(guò)程的關(guān)鍵是生成工具(如 OpenAPI Generator),它能夠根據(jù) API 文檔自動(dòng)生成精確的類型和請(qǐng)求方法,減少了手動(dòng)編寫和維護(hù)的麻煩。

通過(guò)本教程,我們深入了解了如何:

希望通過(guò)這篇教程,你能真正掌握如何將 OpenAPI 規(guī)范與 TypeScript 結(jié)合起來(lái),提升你的開發(fā)效率和代碼質(zhì)量。

文章轉(zhuǎn)自微信公眾號(hào)@雨巷舊事

上一篇:

Kubernetes Gateway API 攻略:解鎖集群流量服務(wù)新維度

下一篇:

使用Spring Boot創(chuàng)建Restful API指南
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)