使用 OAS(OpenAPI標準)來描述 Web API

来源:https://www.cnblogs.com/cgzl/archive/2020/01/20/12217617.html
-Advertisement-
Play Games

無論哪種類型的Web API, 都可能需要給其他開發者使用. 所以API的開發者體驗是很重要的. API的開發者體驗, 簡寫為 API DX (Developer Experience). 它包含很多東西, 例如如何使用API, 文檔, 技術支持等等, 但是最重要的還是API的設計. 如果 API ...


無論哪種類型的Web API, 都可能需要給其他開發者使用. 所以API的開發者體驗是很重要的. API的開發者體驗, 簡寫為 API DX (Developer Experience). 它包含很多東西, 例如如何使用API, 文檔, 技術支持等等, 但是最重要的還是API的設計. 如果 API 設計的不好, 那麼使用該API構建的軟體就需要增加在時間,人力,金錢等方面的投入. 有時候API會被錯用, 甚至帶來毀滅性後果. 最後抱怨該API等用戶越來越多, 慢慢的, 客戶就會停止使用該API. 

 

API的目的是讓人們可以簡單的使用它來達到自己的目的. 目前行業內有很多API風格, 例如: REST, gRPC, GraphQL, SOAP, RPC等等. 但是每個風格都遵循一些基本的設計原則. 

 

用戶就是上帝, 為用戶設計API 

和構建任何東西一樣, 你需要一個計劃, 你需要在真正做之前來決定你想要的是什麼. API 設計也是一樣的. 

API 並不是用來盲目的暴露一些數據或業務處理能力. 它就像我們每天使用的任何形式的介面一樣, 例如微波爐的操作按鈕, 是來幫助用戶完成他們的目標的. 所以需要從用戶的視角來決定一個API的設計目標. 在整個設計過程中, 必須牢記以用戶的視角去設計, 如果以開發者的角度去設計, 那麼問題就大了. 

 

如果以開發者的視角去設計的API, 那麼通常的後果是開發出的API會很註重功能實現的過程和原理, 而不是用戶如何能簡單平滑的使用這個API來達到他們的目的. 所以一定要註重用戶的需求, 而不要讓內部實現細節, 原理什麼的來騷擾用戶. 最後再次強調, 要設計出讓用戶容易理解和容易使用的API. 

所以 API 就是用戶看到的, 它表示出用戶能使用它做什麼. API 的實現細節, 也就是如果完成的該功能的細節, 需要對用戶隱藏. 

 

識別 API 的目標 

記住首先考慮用戶的感受之後, 下麵就需要考慮用戶能拿它來做什麼了, 也就是識別API的目標.  

識別 API 的目標, 最基本的要對以下方面有深刻, 精準的認識: 

  1. Who, 誰可以使用這個API? 

  2. What, 用戶拿這個API能做什麼事?  

  3. How, 用戶如何做這件事? 

  4. What need, 用戶想要做這件事的話還需要什麼? 

  5. What return, 用戶會得到什麼? 

 

1.就是指API的用戶, 4,5分別表示輸入輸出.  

 

針對2, 3解釋一下 

通常針對2.What(用戶拿API能做什麼)可以導致(分解)多個3.How(多個步驟), 這樣的話每個步驟就是一個API的目標. 

比如說, 用戶想去淘寶買一個商品, 那麼怎麼買? 首先需要把商品添加到購物車, 然後再結賬. 那麼這個API就應該有兩個目標: 添加商品到購物車, 以及 結賬. 

如果不這樣分解到話, 通常設計出的API會缺失一些目標. 

 

針對1, 也解釋一下 

首先應該識別出不同種類的用戶, 這裡的用戶可能是人, 也可能是其他的程式. 通常通過檢查輸入和輸出就可以識別出用戶. 

 

總結一下就6個方面: 

  • 用戶 

  • 能做什麼 

  • 如何做 - 分解步驟 

  • 輸入 

  • 輸出 

  • 目標 

 

避免從開發者角度設計API 

這部分包含幾個方面. 包括: 

  • 開發者所在公司的組織結構(參考康威定律) 

  • 數據, 例如數據使用了開發者所在公司內部的一些專有術語, 或者乾脆把內部資料庫模型暴露了出來. 

  • 不要暴露實現細節, 避免受到業務邏輯實現細節的影響 

  • 避免受到軟體架構的影響, 比如說在開發者公司內部查詢產品名稱和產品價格是兩個API, 那麼給用戶使用的API必須整合一下, 不能讓用戶分兩步查詢. 

 

最重要的還是要時刻牢記, 你所設計的這些東西都是用戶真正需要的嗎? 

 

 

下麵切入正題: 

使用API描述格式來描述API 

這裡我以RESTful風格的API為例. 想要瞭解使用ASP.NET Core 3.x 構建 RESTful API, 這裡有一個教程(但是還沒講完) https://www.bilibili.com/video/av77957694/. 

 

很多人使用Excel或者紙和筆來進行API的設計工作. 但是如果想要在設計階段精準描述一個API, 尤其是它的數據, 那麼最好使用一個結構化的工具, 例如API描述格式.  

API描述格式會為API提供一個標準化的描述, 並且它很像代碼. 它的優勢主要有: 

  • 有助於在項目團隊中共用設計 

  • 瞭解這種格式的人或者工具可以很簡單的理解它. 

 

針對REST而言, OpenAPI Specification(OAS) 就是一個非常流行API描述格式規範. 

 

OAS 

API描述格式是一種數據格式, 它的目標就是描述API. 

而OAS (OpenAPI Specification)是一個與編程語言無關的REST API描述格式. 它是由 OAI (OpenAPI Initiative) 所提倡的. OAI 是Linux基金會下麵的一個組織, 專註於提供與供應商無關的描述格式. 而OAS則是社區驅動的一種格式, 任何人都可以做貢獻. 

 

OAS vs Swagger 

OAS 原來叫 Swagger Specification, 2015年11月這個格式被貢獻給了OAI, 併在2016年1月更名為 OpenAPI Specification. Swagger 規範最後的2.0版本就變成了 OpenAPI 2.0. 目前最新的OAS 應該是3.0大版本 

 

YAML 

OAS文檔可以使用YAML或JSON格式, 我使用YAML. 

 

像寫代碼一樣描述API 

OAS文檔就是一個文本文件, 可以納入版本控制系統 ,例如 Git等. 所以在設計迭代的時候很容易進行版本管理和變化追蹤. 

 

編輯器 

OAS有一個線上的專用編輯器: http://editor.swagger.io/ 

@Swagger Ed 
itor. 
File , 
Edit 
Generate Server 
Generate Client 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
16 
17 - 
18 
19 
21 
23 
24 
25 
26 
27 
28 
29 
30 
SMARTBEAR 
Swagger: 
"2.0" 
info: 
description: 
more about 
"This is a sample server Petstore server. You can find out 
Swagger at Chttp://swagger.io](http://swagger.io) or on 
Circ. freenode.net, #swagger](http://swagger.io/irc/). 
For this 
sample, you can use the api key •special-key' 
fi Iters . " 
version: 
"1.0.0" 
title: "Swagger Petstore" 
terms0fService : 
"http : //swagger. io/terms/" 
to test the authorization 
1.0.0 
Swagger Petstore 
[ Base URL: petstore . swagger. io/v2 J 
This is a sample server Petstore server. You can find out more about Swagger at bttp://swagger.io or on 
irc.freenode.net, #swagger. For this sample, you can use the api key special—key to test the 
contact: 
emai I : 
" apitean@swagger.10 
license: 
name: "Apache 2.0" 
url: 
host: "petstore . swagger. io" 
basePath: "/v2" 
tags : 
"pet" 
15- - name: 
" http : //www.apache.org/licenses/LICENSE-2. O. html " 
description: "Everything about your Pets" 
external Docs: 
description: "Find out more" 
"http : //swagger. io" 
url: 
20- - name: "store" 
description: "Access to Petstore orders" 
22 • - name: "user" 
description: "Operations about user" 
external Docs: 
description: "Find out more about our 
url: 
"http : //swagger. to" 
schemes : 
"https" 
"http" 
naths: 
authorization filters. 
Terms of service 
Contact the developer 
Apache 2.0 
Find out more about Swagger 
Schemes 
HTTPS 
pet Everything about your Pets 
Authorize 
Find out more: http://swagger.io 
store" 
POST 
PUT 
/ pet 
/pet 
Add a new pet to the store 
Update an existing pet

左邊是代碼編輯區域, 右邊是渲染結果. 

 

但是我更習慣於本地編輯器, 我使用VSCode, 並安裝 Swagger Viewer 和 openapi-lint 兩個插件. 

EXPLORER 
v OPEN EDITORS 
GROUP 1 
{O one.yaml 
GROUP 2 
x Swagger Preview 
v OAS 
{n} one.yaml 
{O product.yaml 
{n} one.yaml X 
{O one.yaml > { } paths > (products > { } 
Swagger Preview - /Users/solenovex/OAS/one.yaml 
post > { } 
responses > { } 
or 
200 > 
- /Users/solenovex/OAS... 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
openapi: 3. ø.ø 
info: 
title: "Shopping API" 
version 
: "l.ø.ø•• 
paths: 
/products: 
description: The products catalog 
get: 
summary: Sea rch for products 
description: I 
Search for products in catalog 
using a free query parameter 
parameters: 
— name: free—query 
description: I 
A product 's name, reference, 
partial description 
in: query 
required: false 
schema : 
type: string 
responses: 
description: I 
desc 
Swagger 
SMARTBEAR 
Shopping API 
default 
I.o.o 
OAS3 
GET 
POST 
/products Search for products 
/ products Add P roduct 
Products matching free query parameter 
content: 
application/json: 
schema : 
type: array 
description: Array of products 
items : 
type: object 
description: A product 
required: 
reference 
— name

 

共用API描述API進行文檔記錄 

OAS文檔可以用來生成API對引用文檔, 這個引用文檔可以展示出所有可用的資源以及相應的操作. 通常我會使用Swagger UI, 它就是上圖右側的部分. 

 

生成代碼 

使用API描述格式進行描述的API, 其代碼也可以部分生成. 通常是一個代碼骨架. 

 

什麼時候使用API描述格式 

肯定是在設計介面如何表達API目標和概念, 以及數據的時候. 

 

使用OAS來描述REST API的資源以及Action 

創建OAS文檔 

建立一個products.yaml文件.  

然後在裡面輸入 api 或 open等字元串, 會出現兩個提示選項: 

products.yaml 
1 
api 
openapi, OpenAPI 3.0 lintable 
openapi, OpenAPI 3.0 minimal 
OpenAPI 3.0 minimal O

 

先選擇下麵那個選項, 其結果是: 

products.yaml > { } paths 
1 
2 
3 
4 
5 
openapi: 3.ø.ø 
info: 
title: "API" 
versxon 1 
paths:
  • 第1行是Open API的版本 

  • 第4行 info 的 version 是指API的版本, 而info這個版本必須使用雙引號括起來, 否則OAS解析器會把它當成數字, 從而導致文檔驗證失敗(因為它的類型應該是字元串). 

  • 第5行 paths, paths屬性應該包含該API可用的資源. 這裡面使用 {} 僅僅是為了讓文檔驗證通過, 因為我目前還沒有寫什麼內容. 在YAML里, {} 表示一個空的對象, 而非空的對象則不需要這對大括弧. 

 

描述資源 

為了描述products這個資源, 就需要填寫paths屬性: 

1 
2 
3 
4 
5 
6 
7 
openapi: 3.ø.ø 
info: 
title: "API" 
version 
paths: 
/products: 
description: FR51J*l

這裡description屬性不是強制的, 但是它可以用來描述該資源. 

 

描述資源的操作 

OAS文檔里描述的資源肯定包含一些操作, 否則文檔就不合理. 

看代碼: 

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
3.ø.ø 
info: 
title: "API" 
version: "l.ø.ø" 
paths: 
/products: 
description: 
get: 
summa ry: 
description: I

 

我為/products這個資源添加了一個GET Action (get屬性), 然後我對這個get也進行了描述. 

summary相當於是對這個Action的一個概括性描述, 而description則能提供更詳細的描述信息.  

這裡description是支持多行文本的, 但是在YAML裡面要想支持多行文本, 那麼string屬性必須以 | 管道符 開頭. 

註意, 這裡第1行 openapi下麵的波浪線表示文檔驗證失敗. 

 

在OAS文檔里, 一個操作必須在responses屬性里提供至少一個響應: 

1 
2 
3 
4 
5 
6 
7 
8 
9 
lø 
11 
12 
13 
14 
15 
16 
17 
openapi: 3.ø.ø 
info: 
title: "API" 
version: 1 
paths : 
[products: 
description: 
get : 
summary: 
description: I 
responses: 
"2øø•• : 
description: I

一個Action可能有多種響應結果, 每種可能的響應結果都要在responses屬性中描述. 

每個響應都以狀態碼進行標識, 並且必須包含一個description屬性. 

註意: 狀態碼數字必須用雙引號括起來, 因為它的類型本應該是字元串, 而這裡的200是一個數字. 

 

下麵我再添加一個POST Action: 

1 
2 
3 
4 
5 
6 
7 
8 
9 
lø 
11 
12 
13 
14 
15 
16 
17 
18 
19 
2ø 
21 
22 
23 
24 
25 
26 
openapi: 3 .ø.ø 
info: 
title: "API" 
• "1.0.0" 
versxon : 
paths : 
/products : 
description: FR51J* 
get : 
summary: 
description: 
responses : 
"2øø•• : 
description: I 
post: 
summary: 
description: 
responses : 
"2øø•• : 
description: I

 

這裡還是針對 /products 這個資源, 我就不過多解釋了. 

 

使用OpenAPI  JSON Schema 來描述 API 的數據 

OAS 依賴於 JSON Schema 標準來對所有的數據(查詢參數, body 參數, 響應body等)進行描述. 

 

註意, OAS 使用的其實是JSON Schema的一個子集, 並不包含所有的 JSON Schema 特性, 並且還添加了一些 OAS 獨有的特性到這個子集里. 
 

描述查詢參數 

如果我們的get操作里需要一些查詢參數(查詢字元串, Query String), 那麼可以使用 parameters 這個屬性: 

這裡 parameters屬性是一個集合或數組, 每個集合元素使用 - 開頭. 

為了描述一個參數, 至少需要name, in 和 schema 三個屬性. 在本例中, 還包含 required 和 description 兩個可選的屬性. 

  • in表示參數的位置, 這裡值為query, 表述它是查詢字元串(Query String, 例如 api/products?searchTerm=xxx).  

  • required 為 false 表示不是必填參數. required是可選的, 如果沒有寫的話, 那麼它的值就是false. 但是最好還是寫上required屬性. 

  • 它的數據結構使用schema屬性來表示, 這裡就是一個簡單的字元串類型. 但是它其實是一個JSON schema, 所以它可以是複雜的對象類型. 

  • description屬性也是可選的, 但是最好還是寫上吧, 有個描述更好. 

 

使用JSON Schema來描述數據 

假設一個對象有三個屬性: 編號(string), 名稱(string), 價格(number). 那麼使用JSON Schema來描述它就應該是這樣的: 

type: object 
propert les: 
type: string 
type: string 
id: 
name: 
price: 
type: 
number

 

還沒完, 我還必須指出屬性是否是必填的, 然後我再加上一個remark屬性, 它不是必填的: 

type: object 
requi red : 
— id 
— name 
— price 
properties: 
id: 
type: 
name: 
type: 
price: 
type: 
remark: 
type: 
string 
string 
number 
string

 

JSON Schema 通過 required 這個集合屬性來表示哪些屬性是必填的. 

 

此外, 我還可以在這裡添加 description 和 example (示例)屬性: 

type: object 
description: 
required : 
— id 
— name 
— price 
properties: 
id: 
type: string 
description: FRfi
<br>
              <div class=
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 事件註冊事件給元素添加事件,為註冊事件或者綁定事件註冊事件兩種方式傳統方式監聽事件方式事件監聽addEventListener() 事件監聽 (IE9以上)eventTarget.addEventListener(type, listener, [useCapture])參數type: 事件類型字元... ...
  • 字元串方法 search() 方法搜索特定值的字元串,並返回匹配的位置。 相比於indexOf(),search()可以設置更強大的搜索值(正則表達式) substring() 類似slice() ,兩個參數均為索引值, substr() 類似slice() ,第2個參數為長度,如果省略則長度直至末 ...
  • 針對近日華為,小米的部分機型,在升級系統或升級微信之後,微信內置瀏覽器產生的rem不能正確填充滿的問題,有如下解決方案 目前來看,產生這個情況的原因是因為給html附font-size時,附上的font-size和實際上html的font-size 大小並不一致 如圖: 在問題機型上展示的三個值 分 ...
  • 彈出輸入框會使視口高度發生變化,彈出輸入框後動態匹配這個高度 以下是使用jq的方法 $('input').on('blur', function () { setTimeout(function () { var scrollHeight = document.documentElement.scr ...
  • 問題1: 通過document.addEventListener("scroll",function(){})對頁面滾動監聽事件進行監聽,但ios下$(document).scrollTop()值始終為0,對頁面監聽無效。 原因: 因為iOS下iframe的高度會根據頁面的內容自適應,造成了ifra ...
  • Title: Why you should use Object.is() in equality comparison Author: TarekAlQaddy Website: https://www.jstips.co/en/javascript/why-you-should-use-Obje ...
  • 一曲肝腸斷 ,天涯何處覓知音。 借用星爺電影的一句臺詞作為開篇,形容下自己的心境,年終將至,迴首2019,也不算太虧欠自己,明年繼續努力生長。 這是自己第一次在博客介紹自己,目前坐標長沙,三流大專,市場營銷專業,是的,毫不相干的專業,也讓我在轉行前端途中吃了比一般人多一點的苦頭,為什麼轉行呢,自然是 ...
  • 基於個人的經驗,談談設計模式在網關中的應用。因為是經驗之談,沒有絕對的對與錯。 下麵整理的是我最常使用的設計模式,我用設計模式的前提是 讓代碼的可讀性變強 能支持日後功能擴展 單例 目的 保證全局只有一個實例,防止因為頻繁的創建、銷毀對象而造成不必要的性能開銷。 在網關項目中,單例模式是出現頻率最高 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...