インフラ担当の柴田です。「Web エンジニアなら知っておきたい」ということで、今日はOpenAPI Specification の主要な構成要素、データ型、制約について紹介します。
OpenAPI Specificationとは?
OpenAPI Specification(OAS)*1は、HTTP APIのインタフェースを定義するための仕様で広く採用されています*2。OASに則ってAPIのインタフェースを記述することにより、人間とコンピュータ双方がAPIの利用方法を理解できます。 現在はOpenAPI Initiativeという組織で管理、推進されています。
OpenAPI Document
OASに則って定義されたAPIの仕様書は、OpenAPI Documentと呼ばれています。OpenAPI DocumentはYAMLまたはJSON形式で記述されます。
OpenAPI Documentの主要な構成要素
OpenAPI Documentは、APIの要素を定義するいくつかのフィールドから成り立っています。主要なフィールドとしては以下のものがあります。
- openapi: OASのバージョンを記述します
- iInfo: APIの基本情報を記述します(タイトル、バージョンなど)
- servers: APIがホストされているサーバーのURLを記述します
- paths: インタフェース定義のメイン部分です。APIが提供するエンドポイントやリクエスト時のHTTPメソッド(GET、POSTなど)、レスポンスの定義などを記述します
- components: リクエストやレスポンスで使われるデータ構造を記述します
データ型と制約
OASでは、APIでやり取りされるデータの型type
を使い定義します。以下のデータ型が利用できます。
データ型はformat
を用いることでより詳細な情報を提供できます。
データ型の例
type | 説明 |
---|---|
integer | 整数 |
number | 浮動小数点数含む数値 |
string | 文字列 |
boolean | 真偽値 |
array | 配列 |
object | キーと値のペアからなるオブジェクト |
format の例
type | format | 説明 |
---|---|---|
integer | int32 | 符号付き32ビット整数 |
integer | int64 | 符号付き64ビット整数 |
number | float | 浮動小数点数 |
number | double | 倍精度の浮動小数点数 |
string | password | 入力をマスクするためのUIへのヒント |
データ型には以下のようなValidation Keywordsを追加できます。Validationの情報を使うことで値の制約を定義することができます。
Validation Keywords
Validation | 説明 |
---|---|
minimum | 数値の最小値 |
maximum | 数値の最大値 |
minLength | 文字列の最小長 |
maxLength | 文字列の最大長 |
pattern | 文字列が満たすべき正規表現パターン |
APIの定義例
https://github.com/OAI/OpenAPI-Specification/blob/main/examples/v3.0/petstore.yamlより一部抜粋
openapi: "3.0.0" info: version: 1.0.0 title: Swagger Petstore license: name: MIT servers: - url: http://petstore.swagger.io/v1 paths: /pets: get: summary: List all pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false schema: type: integer maximum: 100 format: int32 responses: '200': description: A paged array of pets headers: x-next: description: A link to the next page of responses schema: type: string content: application/json: schema: $ref: "#/components/schemas/Pets" default: description: unexpected error content: application/json: schema: $ref: "#/components/schemas/Error" components: schemas: Pet: type: object required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string Pets: type: array maxItems: 100 items: $ref: "#/components/schemas/Pet" Error: type: object required: - code - message properties: code: type: integer format: int32 message: type: string
この例は、OpenAPI Initiativeが公開しているサンプルのOpenAPI Documentでペットのリストを取得するためのAPIエンドポイント/pets
を定義しています。
/pets
にGETリクエストを送ると、ペットオブジェクトの配列が返ることが分かります。さらに、ペットオブジェクトは、id
(整数型)とname
(文字列型)とtag
(文字列型)のプロパティを持ち、id
とname
は必須のパラメータということが分かります。
パラメータには前述のようにValidation Keywordsでどのような値が受け入れられるのかを記述が可能です。APIのパラメータにはできる限りValidation Keywordsを定義するようにしてください。例のOpenAPI Documentではname
は文字列型ということは分かりますが、何文字まで許されるのかが利用者に分からないため利用時に問題になります。
まとめ
APIのインタフェース定義は、チームで開発するうえで重要なドキュメントになります。OASは広く利用されている記述方法になるため是非書き方や読み方を学んでください。
*1:以前はSwagger Specificationと呼ばれていました
*2:様々なサードパーティー製ツールが存在していることからも人気がうかがえます https://openapi.tools/