安全的關(guān)鍵.png)
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
首先,我們要理解 Swagger 和 OpenAPI 規(guī)范的基本概念,因?yàn)樗鼈兪俏覀兩?TypeScript 類型的核心。
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ù)組。
通過(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 類型,所有的類型和文檔都可以同步更新。
我們需要以下工具來(lái)實(shí)現(xiàn) OpenAPI 到 TypeScript 類型的生成:
首先,安裝 OpenAPI Generator。這個(gè)工具可以從 OpenAPI 規(guī)范自動(dòng)生成代碼和類型。
你可以通過(guò) npm
或 yarn
安裝它:npm install @openapitools/openapi-generator-cli -g
或者通過(guò) Homebrew 安裝:brew install openapi-generator
接下來(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è)命令:
-i swagger.yaml
:指定輸入的 OpenAPI 規(guī)范文件(swagger.yaml)。-g typescript-fetch
:指定生成的代碼類型為 typescript-fetch
,這是一個(gè)用于生成 TypeScript 客戶端代碼的模板。-o ./generated
:指定輸出目錄,生成的代碼將存放在 ./generated
目錄下。執(zhí)行這個(gè)命令后,./generated
文件夾下會(huì)生成 TypeScript 類型定義文件、API 客戶端代碼、請(qǐng)求方法等。我們可以直接在 TypeScript 項(xiàng)目中使用這些文件。
在生成 TypeScript 類型后,你會(huì)看到類似這樣的代碼結(jié)構(gòu):
在?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)。
生成的 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ù)處理更加可靠。
現(xiàn)在,我們已經(jīng)生成了 API 客戶端和相關(guān)類型,接下來(lái)將其集成到一個(gè) Vue 3 + TypeScript 項(xiàng)目中。假設(shè)我們?cè)?Vue 3 項(xiàng)目中需要獲取用戶列表并展示。
首先,確保你已經(jīng)安裝了?axios
?或?fetch
?作為 HTTP 請(qǐng)求庫(kù)。你可以選擇使用?axios
,因?yàn)樗`活且易于使用。npm?install?axios
然后,在 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)正確。
通過(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)@雨巷舊事
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)