中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenAPI概述是怎樣的

發布時間:2021-11-15 16:34:32 來源:億速云 閱讀:368 作者:柒染 欄目:云計算

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.jsonopenapi.yaml

schema

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

swagger字段用于描述規范的版本,字段類型為string。比如Kubernetes的swagger字段如下所示:

{
	"swagger": "2.0",
	...
}

該字段表明當前API文檔采用的規范版本,主要用于相關工具識別并處理該文檔。

必選字段:info

info字段用于描述API的基本信息,字段類型為Info ObjectInfo Object類型包含以下兩個必須字段:

  • title:類型為string,表示應用的名稱。

  • version:類型為string,表示應用的版本。

比如,Kubernetes的info字段如下所示:

{
	"info": {
		"title": "Kubernetes",
		"version": "v1.19.0"
	},
	...
}

info字段表示了該文檔記錄的是Kubernetes的v1.19.0版本的接口。

必選字段:paths

paths字段用于描述API的各個端點及支持的操作,字段類型為Paths ObjectPaths 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字段用于定義一組被各個接口引用(消費或產生)的對象,類型為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用于表示接口調用成功后的返回內容,該對象表示一定會返回versionsserverAddressByClientCIDRs信息,實際調用成功后的輸出如下所示:

[root@ecs-d8b6 ~]# curl localhost:8080/api/
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "localhost:6443"
    }
  ]
}

關于OpenAPI概述是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新乡市| 景德镇市| 布尔津县| 桓仁| 绥中县| 望江县| 乌拉特前旗| 台湾省| 弋阳县| 宁陕县| 澳门| 华蓥市| 赣榆县| 桑植县| 云龙县| 大理市| 潮安县| 盐源县| 九江县| 苍山县| 固安县| 澎湖县| 泸定县| 大足县| 温州市| 清徐县| 民乐县| 阿瓦提县| 谢通门县| 安西县| 霍邱县| 遵义县| 阿图什市| 安阳县| 南木林县| 青田县| 琼海市| 大丰市| 西峡县| 赤水市| 旬邑县|