Open5
スキーマ駆動開発について学習&調査
現在自分が参画している案件でスキーマ駆動開発で行っているので,調べつつ学習する
参考書籍:WEB+DB PRESS vol.108 2019
3年以上ということもあって,古い情報であることも留意しつつ,この書籍でベースの基本知識を学んでいく。
Web APIの分類
- SSKDs ... 特定少数の開発者
- 例:開発チーム内部で利用するAPI
- LSUDs ... 不特定多数の開発者
- 例:外部に公開して利用してもらうAPI
スキーマ駆動開発におけるWebAPI開発でのメリット
開発効率の向上
- クライアント側の開発とサーバの開発が非同期で進められる
- クライアントへ渡すデータが先に決まっていたら,クライアント側は,WebAPIの実装完了を待たずに開発を進められる
- スタブサーバでテストが可能
- クライアントへ渡すデータが先に決まっていたら,クライアント側は,WebAPIの実装完了を待たずに開発を進められる
- スキーマがそのままドキュメントとして活かせるので,これを基にクライアントとサーバ間で相談・調整がしやすい
- ドキュメントが自動的に生成される(OpenAPIのSwaggerUI)
OpenAPI(前身であるSwagger)の特徴
- マシンリーダブルであること
- ヒューマンリーダブルであること
- REST Web APIを徹底的であること
OpenAPIのスキーマ構造内のオブジェクト一部
JSON形式からYAML形式のどちらかで作られる。
オブジェクト単位で階層構造となっている。- openapi
- info
- servers
- paths
info
メタデータを格納するオブジェクト。
APIの名前・説明・概要,バージョン情報,連絡先,ライセンス情報など
{
"title": "Sample Pet Store App",
"summary": "A pet store manager.",
"description": "This is a sample server for a pet store.",
"termsOfService": "https://example.com/terms/",
"contact": {
"name": "API Support",
"url": "https://www.example.com/support",
"email": "support@example.com"
},
"license": {
"name": "Apache 2.0",
"url": "https://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "1.0.1"
}
servers
APIサーバーの情報について記載されている。(URL・概要など)
本番・ステージング・ローカルなど複数指定できる。
paths
エンドポイント毎のAPI仕様(リクエスト・レスポンス)について記載されている。
pathsオブジェクトの中で階層が分けられている。
- Paths
- PathItem
- Operation
パスをキーにして複数のPathItemオブジェクトを持ち,PathItemオブジェクト内に複数のOperationオブジェクト(HTTPメソッド)を持つ。
- Operation
- PathItem
{
"/pets": {
"get": {
"description": "Returns all pets from the system that the user has access to",
"responses": {
"200": {
"description": "A list of pets.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/pet"
}
}
}
}
}
}
}
}
}
YAMLの方が若干見やすい。
/pets:
get:
description: Returns all pets from the system that the user has access to
responses:
'200':
description: A list of pets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/pet'
Operationオブジェクト内に$ref
があるが,これはリファレンスオブジェクトと別オブジェクトへの参照。これにより,重複の記載を防ぐ。
今回の場合,Componentsオブジェクト内に記載された/schemas/pet
を参照している。
Components
再利用されるリクエストボディ・レスポンスをここに記載する。
Schemaオブジェクト
リクエスト・レスポンスで使うデータの型や構造を定義する。
Properties field
そのオブジェクトが持つプロパティが記載されている。
- example
- 具体的な値の例
- xml
Parameter
APIサーバーに送信するパラメータを定義するオブジェクト。
{
"name": "token",
"in": "header",
"description": "token to be passed as a header",
"required": true,
"schema": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
}
},
"style": "simple"
}