1818
1919[ OpenAPI Specification 2.0(Swagger, OAS2)] ( https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md ) 定義についてのコーディング規約をまとめます。より新しいバージョンとして OAS 3.0.3 規約(作成中)がありますので、ご注意ください。
2020
21- 本規約の[ 前提条件] ( prerequisite.md ) に従い作成されています。ToC 向けの LSUDs(Large Set of Unknown Developers)な Web API にはマッチしない可能性があります。
22-
23- Web API 自体の設計については範囲外としますが、[ API 設計標準] ( API_Design.md ) に利用するステータスコードなどは記載しています。
21+ # 前提条件
22+
23+ 本規約は以下の前提で作成されたものである。。ToC 向けの LSUDs(Large Set of Unknown Developers)な Web API にはマッチしない可能性があります。
24+
25+ - 業務システム向けの Web API 提供
26+ - サードパーティ向けに広く開発する Web API ではなく、限られたクライアントやシステムと連携すること
27+ - いわゆる、LSUDs(Large Set of Unknown Developers)ではなく、SSKDs(Small Set of Known Developers)を対象とする
28+ - RESTish な Web API
29+ - 原理的な REST を必ずしも守る必要はないが、例えば HTTP メソッドは、参照は GET、登録は POST、更新は PUT や PATCH、削除は DELETE で使い分けていたり、Web API の要求が成功すれば 200(OK)、204(No Content)を返し、リソースが無ければ 404(Not Found)、操作に失敗すれば 500 系のエラーを返すといったことを指す
30+ - 本規約を利用するに当たり必須条件ではないが、定義例などはそれに基づいて記載しているので注意する
31+ - スキーマファースト
32+ - OpenAPI Specification の定義ファイルを駆動に、クライアント・サーバサイドのコード生成やモック時の利用に用い、高速な Web API 開発につなげることを前提とする
33+ - Python における、FastAPI・Django REST Framework のように、アプリケーションコードから OpenAPI document を自動生成する開発手法も存在するが、本規約はこれは想定しない
34+ - 定義ファイルの完成度はできるかぎり高め、コード生成やドキュメントの価値を高める
35+ - OAS 定義からコードを生成し、通常は記載した型・項目長・最大~最小・enum・必須定義・正規表現フォーマットでバリデーションを行い、カバーできない部分のバリデーションをアプリケーション固有ロジックとして実装する方針とする。例えば、複数項目間のチェックや DB を確認しないと行えないチェックである
36+ - ドキュメントとしての価値を高めるため、その API 呼び出しで発生しうる全ての HTTP ステータスコードを記載する
37+ - API の振る舞いを読み手に伝えるものとして、どのような異常系があるかは有用な場合が多いからである
38+ - JavaScript/TypeScript、Java、Go のエコシステムがターゲット
39+ - OpenAPI Specification は広く受け入れられており、コレに対応する様々なツールやフレームワークといったエコシステムがあり、中には定義された設定がうまく認識されない場合がある。本規約では対応していないツールが多い場合、特定の記法を非推奨とすることがあり、同時にその理由も説明する
40+ - 全ての言語・フレームワーク・ツールの対応状況は調査しきれていないため、利用するプロダクトの対応状況は利用者側で確認をお願いする
2441
2542# 免責事項
2643
@@ -30,9 +47,136 @@ Web API 自体の設計については範囲外としますが、[API 設計標
3047
3148:::
3249
33- # ファイルフォーマット
50+ # API設計
51+
52+ Web API の設計自体はこの規約の範囲外であるが、簡易的な方針を示す。必要に応じて参考にされたい。
53+
54+ ## HTTP メソッド
55+
56+ 実現したい操作により、以下のような使い分けを想定する。HEAD(リソースの存在チェック)、GET(参照)、POST(新規作成)、PUT(更新)、PATCH(一部更新)、DELETE(削除)。
57+
58+ ## HTTP ステータス
59+
60+ [ RFC 7231] ( https://tools.ietf.org/html/rfc7231#section-6 ) で定義されているレスポンスステータスコードを利用します。
61+
62+ [ RFC9205] ( https://datatracker.ietf.org/doc/html/rfc9205 ) ([ 日本語訳] ( https://tex2e.github.io/rfc-translater/html/rfc9205.html#section-4.6 ) )の方針に原則則る。ユースケース別に利用すべき HTTP ステータスコードを記載します。
63+
64+ ### 共通
65+
66+ - バリデーションエラー:` 400 Bad Request `
67+ - 業務エラー:` 400 Bad Request `
68+ - 認証エラー:` 401 Unauthorized `
69+ - 認可エラー:` 403 Forbidden `
70+ - システムエラー:` 500 Internal Server Error `
71+
72+ ### GET
73+
74+ - 正常系:` 200 OK `
75+ - 検索系 API で結果 0 件の場合も、 ` 200 OK ` を返すとする
76+ - パスキー検索系 API で対象リソースが存在しないエラー:` 404 Not Found `
77+
78+ ### POST
79+
80+ - 正常系(同期):` 201 Created `
81+ - 正常系(非同期):` 202 Accepted `
82+ - 一意制約違反エラー:` 409 Conflict `
83+ - 親リソースが存在しないエラー:` 404 Not Found `
84+
85+ ### PUT
86+
87+ - 正常系(同期):` 200 OK `
88+ - 正常系(非同期):` 202 Accepted `
89+ - 対象リソースが存在しないエラー:` 404 Not Found `
90+
91+ ### DELETE
92+
93+ - 正常系:` 204 No Content `
94+ - もし、削除した項目の情報を応答する場合は ` 200 OK ` とする
95+ - 対象リソースが存在しないエラー:` 404 Not Found `
96+
97+ ## API バージョン管理
98+
99+ - /v1, /v2 といったパスで表現する
100+ - 型名変更、必須パラメータの追加、レスポンスの桁数変更、などをするときはバージョンを上げることを検討する
101+
102+ ## パラメータの命名
103+
104+ boolean 型である場合、 ` [a-zA-Z0-9-_]+_flag ` という命名は非推奨とする。
105+
106+ ` is_[a-zA-Z0-9-_]+ ` や ` has_[a-zA-Z0-9-_]+ ` などの命名を代わりに検討する
107+
108+ # YAMLファイルフォーマット
109+
110+ OpenAPI ドキュメントは JSON 形式、YAML 形式いずれかのフォーマットで記載できるが ** YAML 形式** を利用する。理由として、JSON と比較して YAML は視覚的に見やすく、レビューや差分管理が行いやすいためである。
111+
112+ ## ファイル名
113+
114+ ファイルの拡張子は ` yaml ` とする。通常ファイル名は ` api.yaml ` や ` swagger.yaml ` (v2 の場合) を推奨する。
34115
35- [ ファイルフォーマット規約] ( file_standards.md ) に準じる。
116+ もし、複数の Swagger 定義を管理するため区別したい場合は ` ${service}_api.yaml ` とする。
117+
118+ ` ${service} ` にはサービス名を指定する
119+
120+ ## YAML バージョン
121+
122+ [ YAML v1.2] ( https://yaml.org/spec/1.2.2/#61-indentation-spaces ) を用いる。
123+
124+ ## ファイルレイアウト
125+
126+ - ファイルの最終行には空行を入れる
127+ - 文字コードは UTF-8 とする
128+ - タブは半角スペース 2 つとする
129+
130+ ## クォート
131+
132+ クォートは可読性を上げるために、できる限り利用しない。利用する場合はダブルクォートを利用する。
133+
134+ ``` yaml
135+ # OK
136+ description : 何かしらの説明
137+
138+ # NG(クォートでのラップは不要)
139+ description : ' 何かしらの説明'
140+ description : " 何かしらの説明"
141+ ` ` `
142+
143+ 以下の場合は必須で利用する
144+
145+ - 文字列として認識させる必要のある数字("0123")
146+ - 60 進数と認識させたくない場合("12:34")
147+ - Bool として認識させたくない("true", "false", "yes", "no", "y", "n", "on", "off")
148+ - ` #` で始まる文字列(`#` はコメントを示す記号のためである。例: `#/definitions/Users`)
149+
150+ # # YAML 配列スタイル
151+
152+ - 複数項目を指定する場合は、 **Flow style(配列スキーム)** を用いることを推奨する
153+
154+ ` ` ` yaml
155+ # OK(推奨: 配列リテラル構文)
156+ required: [user_id, user_name, account_type, register_at]
157+
158+ # NG(非推奨: リスト構文)
159+ required:
160+ - user_id
161+ - user_name
162+ - account_type
163+ - register_at
164+ ` ` `
165+
166+ - YAML は項目定義がネストすることで縦長な定義になりやすい。情報密度を上げるために配列リテラルを推奨する
167+
168+ # # 改行の表現
169+
170+ 改行を含む場合は、パイプ(ブロックスカラー) `|` を用いる
171+
172+ ` ` ` yaml
173+ description: |
174+ 説明文1
175+ 説明文2
176+ - 箇条書き1
177+ - 箇条書き2
178+ - 箇条書き3
179+ ` ` `
36180
37181# 要素規約
38182
0 commit comments