Skip to content

Commit 6f52f68

Browse files
authored
OpenAPI規約を1つに統合 (#207)
1 parent c77aebc commit 6f52f68

File tree

5 files changed

+301
-165
lines changed

5 files changed

+301
-165
lines changed

documents/forOpenAPISpecification/API_Design.md

Lines changed: 0 additions & 57 deletions
This file was deleted.

documents/forOpenAPISpecification/OpenAPI_Specification_2.0.md

Lines changed: 149 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,26 @@ head:
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

Comments
 (0)