您好,登錄后才能下訂單哦!
OpenAPI概述是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
通常所說的OpenAPI是指OpenAPI規范(OpenAPI Specification),簡稱OAS,該規范用于規范RESTful風格的API描述方法。
我們有很多種方法來描述一個web服務的API,比如使用world文件描述,但這樣的API描述不夠通用。 OpenAPI規范定義了一種通用的接口描述方法,按照這個規范定義接口,不僅適合人閱讀,也方便程序處理。
OpenAPI規范的前身是Swagger規范,其由名為Swagger API
的項目發展而來。
2011年,美國的工程師Tony Tam
創建了Swagger API
項目,該項目由早期的規范和一系列工具組成,此時規范還稱為Swagger規范
。
該項目最初幾年發展并不順利,只有一些小公司和個人開發者認可該項目,同時業界也出現了一些競爭對手, 比如同樣用于描述API的RAML
,雖然此時Swagger規范
的熱度仍遠遠高于其競爭對手, 但這僅得益于Swagger API
項目的先發優勢。同期出現的競爭對手擁有強大的背景和資金支持,長期發展下去Swagger API
項目必然落于下風,進而只能成為互聯網發展史上一個被人遺忘的詞條。
Swagger API
項目若要繼續發展,不僅需要資金支持,還需要諸如Google這樣的互聯網大廠認可,只有這樣Swagger規范
才有可能成為業界通用的規范。
在2015年,Swagger API
項目的創建者Tony Tam
跳槽到了SmartBear Software
公司,在該公司的支持下,Swagger API
項目取得了奠定未來格局的變化。
同樣是2015年,SmartBear Software
公司將Swagger規范
捐獻給Linux基金會,Linux基金會專門成立新的項目OpenAPI Initiative
用于托管該規范,新項目的創始成員包括Google、IBM和微軟等公司。通過該方式,Swagger規范
得到了互聯網大廠的支持并得以繼續發展。
接著,Swagger規范
從原Swagger API
項目中剝離出來,更名為OpenAPI規范
后托管到OpenAPI Initiative
項目,Swagger API
項目中仍保留了與該規范相關的工具。
自此,在Linux基金會的運作下,OpenAPI規范
逐漸成為業界事實上的標準,而原Swagger API
項目的資助者SmartBear Software
公司則繼續運營與規范相關的工具產品,根據2017年的統計數據,這些工具每日下載量高達10萬次。
當SmartBear Software
公司將Swagger規范
捐獻給Linux基金會時,Swagger規范
版本為2.0,業界習慣上將使用該規范描述的API文件命名為swagger.json
,此時Swagger規范
2.0版本和OpenAPI規范
2.0版本是完全一致的,只是規范的一次重命名。
在Linux基金會的運作下,OpenAPI規范
繼續演進,并于2017年發布了3.0版本,該版本不僅支持使用JSON格式描述API還支持YAML格式,按照規范,使用該版本規范描述API的文件推薦命名為openapi.json
或openapi.yaml
。
schema常被簡單地譯為模式
,但它往往表示事物的組織和結構,比如數據庫的schema表示數據庫的組織和結構,同理OpenAPI規范
也定義了一組schema對象,用于表示一個完整的OpenAPI規范
文件。
每個版本的OpenAPI規范
會有不同的schema對象,由于Kubernetes(v1.18.0)仍在使用OpenAPI規范
2.0版本,所以本文僅介紹一點Kubernetes用到的schema對象,更詳細的內容請查閱規范。
訪問kube-apiserver的/openapi/v2
接口即可獲取完整的接口描述文件,比如在本地集群中執行如下命令:
[root@ecs-d8b6 ~]# curl localhost:8080/openapi/v2
該命令會輸出完整的接口描述文件。該文件中由一系列字段組成,每個字段均稱為一個schema對象,字段分為必選字段和可選字段。
swagger字段用于描述規范的版本,字段類型為string。比如Kubernetes的swagger字段如下所示:
{ "swagger": "2.0", ... }
該字段表明當前API文檔采用的規范版本,主要用于相關工具識別并處理該文檔。
info字段用于描述API的基本信息,字段類型為Info Object
。 Info Object
類型包含以下兩個必須字段:
title:類型為string,表示應用的名稱。
version:類型為string,表示應用的版本。
比如,Kubernetes的info字段如下所示:
{ "info": { "title": "Kubernetes", "version": "v1.19.0" }, ... }
info字段表示了該文檔記錄的是Kubernetes的v1.19.0版本的接口。
paths字段用于描述API的各個端點及支持的操作,字段類型為Paths Object
。 Paths Object
類型又由Path Item Object
類型構成,Kubernetes的端點/api
描述如下所示:
{ "paths": { "/api/": { "get": { "description": "get available API versions", "consumes": [ "application/json", "application/yaml", "application/vnd.kubernetes.protobuf" ], "produces": [ "application/json", "application/yaml", "application/vnd.kubernetes.protobuf" ], "schemes": [ "https" ], "tags": [ "core" ], "operationId": "getCoreAPIVersions", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions" } }, "401": { "description": "Unauthorized" } } } }, ... } }
從上面的信息可以看出端點(接口)/api/
支持get
操作,用consumes
表示該接口支持的媒體類型,用produces
表示該接口支持返回的媒體類型,用responses
表示可能的返回值。
其中$ref
表示引用自定義的另一個對象。
definitions字段用于定義一組被各個接口引用(消費或產生)的對象,類型為Definitions Object
。
{ "definitions": { "io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions": { "description": "APIVersions lists the versions that are available, ...", "type": "object", "required": [ "versions", "serverAddressByClientCIDRs" ], "properties": { ... "kind": { "description": "Kind is a string value representing the REST resource ...", "type": "string" }, "serverAddressByClientCIDRs": { "description": "a map of client CIDR to server address that is serving this group. ...", "type": "array", "items": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR" } }, "versions": { "description": "versions are the api versions that are available.", "type": "array", "items": { "type": "string" } } }, ... }, ... } }
簡單說來,使用definitions字段定義的字段可以被多個操作引用,從而達到復用的目的。需要引用其他對象時只需要使用$ref
指定復用的對象即可,如下所示:
"$ref": "#/definitions/對象名"
在上面infos字段中引用了對象io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions
用于表示接口調用成功后的返回內容,該對象表示一定會返回versions
和serverAddressByClientCIDRs
信息,實際調用成功后的輸出如下所示:
[root@ecs-d8b6 ~]# curl localhost:8080/api/ { "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "localhost:6443" } ] }
關于OpenAPI概述是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。