Skip to content

Commit 2148023

Browse files
authored
Add OpenAPI v3 standards (#84)
1 parent a5bb0a5 commit 2148023

File tree

5 files changed

+1911
-102
lines changed

5 files changed

+1911
-102
lines changed

documents/forOpenAPISpecification/API_Design.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ OpenAPI Specification 規約を利用するに当たり、想定する Web API
88

99
## HTTP ステータス
1010

11-
原則として[RFC 7231](https://tools.ietf.org/html/rfc7231#section-6)で定義されているレスポンスステータスコードを利用します。
11+
[RFC 7231](https://tools.ietf.org/html/rfc7231#section-6)で定義されているレスポンスステータスコードを利用します。
1212

13-
ユースケース別に利用すべき HTTP ステータスコードを記載します。
13+
[RFC9205](https://datatracker.ietf.org/doc/html/rfc9205)[日本語訳](https://tex2e.github.io/rfc-translater/html/rfc9205.html#section-4.6))の方針に原則則る。ユースケース別に利用すべき HTTP ステータスコードを記載します。
1414

1515
### 共通
1616

documents/forOpenAPISpecification/OpenAPI_Specification_2.0.md

Lines changed: 109 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,15 @@ meta:
1717

1818
[OpenAPI Specification 2.0(Swagger, OAS2)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md)定義についてのコーディング規約をまとめます。より新しいバージョンとして OAS 3.0.3 規約(作成中)がありますので、ご注意ください。
1919

20-
## 適用箇所
20+
本規約の[前提条件](prerequisite.md)に従い作成されています。ToC向けのLSUDs(Large Set of Unknown Developers)なWeb APIにはマッチしない可能性があります。
2121

22-
本規約は以下の[前提条件](prerequisite.md)で作られたものである。
23-
24-
## Web API 自体の設計について
25-
26-
[API 設計標準](API_Design.md) に準じる。
22+
Web API自体の設計については範囲外としますが、[API 設計標準](API_Design.md)に利用するステータスコードなどは記載しています。
2723

2824
## ファイルフォーマット
2925

30-
[ファイルフォーマット規約](yaml_standards.md)に準じる。
26+
[ファイルフォーマット規約](file_standards.md)に準じる。
3127

32-
# 要素規約
28+
## 要素規約
3329

3430
Swagger の基本構造は以下の、swagger・info・host・basePath・schemes・paths・definitions から構成される。
3531

@@ -680,97 +676,113 @@ definitions:
680676

681677
## バリデーションについて
682678

679+
OpenAPI 定義を記載するにあたり、バリデーションをどこまで厳密に定義すべきかという議論はよく行いがちである。
680+
683681
リクエストパラメータの各項目に対して、必須・型・桁・区分値・日付・正規表現のチェックが行える。レスポンスで用いるモデルについても同様に設定でき、`enum`, `pattern` 以外は API の利用者(クライアント)側の DB 設計などに必要な型桁情報を渡すのに有用であるため、できる限り詳しく指定する。
684682

685-
- 必須(`required`)
686-
- 必須パラメータのみ `required: true` を定義する
687-
- デフォルト値(`default`)
683+
### 必須
688684

689-
- パラメータにデフォルト値がある場合は定義する
685+
必須パラメータのみ `required: true` を定義する
690686

691-
```yaml
692-
# ex. enum
693-
name: limit
694-
type: number
695-
format: integer
696-
minimum: 1
697-
maximum: 100
698-
default: 20
699-
description: 検索結果の項目数上限(1~100が指定可能)
700-
```
687+
### デフォルト値
701688

702-
- API 公開後に、default 値を変更してはならない(API の互換性が崩れるため)。もし変更する場合は、API のバージョンを上げること
703-
704-
- 型(`type`)
705-
- `string(文字列)`, `number(数値)`, `integer(整数値)`, `boolean(真偽値)` `array(配列)`, `file(ファイル)` のうちどれか指定する
706-
- フォーマット(`format`) は以下の型の詳細情報を示すもので、可能な限り設定する
707-
- `integer` (整数)
708-
- `int32`, `int64`
709-
- `number` (数値)
710-
- `float`, `double`
711-
- `string` (バイナリ)
712-
- `byte`: Base64 でエンコードされた文字列
713-
- `binary`: バイト配列
714-
- `string` (日付)
715-
- `date`: [RFC3339](https://www.rfc-editor.org/rfc/rfc3339) full-date
716-
- 項目名は `_on` を接尾辞につけることを推奨とする
717-
- `date-time`: [RFC3339](https://www.rfc-editor.org/rfc/rfc3339) date-time
718-
- 項目名は `_at` を接尾辞につけることを推奨とする
719-
- `string` (その他)
720-
- `password`: Swagger UI で入力が隠される
721-
- その他、 `email`, `uuid` など Open API 仕様に存在しない任意のフォーマットを独自のドキュメント生成などのために記載しても良い
722-
-
723-
- 文字列
724-
- 最大桁数:`maxLength`
725-
- 最小桁数:`minLength`
726-
- 数値または整数値
727-
- 最小値(境界値を含む):`minimum`
728-
- 最大値(境界値を含む):`maximum`
729-
- 境界値を含まない場合のみ`exclusiveMinimum: true`または`exclusiveMaximum: true`を定義する。minimum, maximum で代用できる場合は利用しない
730-
- 配列:
731-
- 最大要素数:`maxItems`
732-
- 最小要素数:`minItems`
733-
- `required: true`の場合は原則として`minItems: 1`を定義する
734-
- `uniqueItems` は必須で指定する(通常は一意であるべき)
735-
- API 公開後に、レスポンスの `maxLength` を以前より大きい値に変更してはならい
736-
- レスポンスの `maxLength` など API 利用者側システムの DB の ERD 定義のインプットになる事が多いため。もし行う場合は API のバージョンを上げることや、連携先に桁数変更の旨を調整するなどの考慮を行う
737-
- 区分値(`enum`)
738-
739-
- `description`に区分値の論理名を記載する
689+
パラメータにデフォルト値がある場合は`default` を定義する。
740690

741-
```yaml
742-
name: gender
743-
type: string
744-
enum: ["0", "1", "2", "9"]
745-
description: |
746-
性別
747-
0: 不明
748-
1: 男
749-
2: 女
750-
9: 適用不能
751-
```
691+
```yaml
692+
# ex. enum
693+
name: limit
694+
type: number
695+
format: integer
696+
minimum: 1
697+
maximum: 100
698+
default: 20
699+
description: 検索結果の項目数上限(1~100が指定可能)
700+
```
752701

753-
- **固定値** の場合も enum を 1 つだけ指定して表現する。この場合もレスポンスで利用する場合は指定しない
702+
【注意】API 公開後に、default 値を変更してはならない(API の互換性が崩れるため)。もし変更する場合は、API のバージョンを上げること。
754703

755-
```yaml
756-
name: file_layout
757-
type: string
758-
enum: ["json"]
759-
description: ファイルレイアウト
760-
```
761704

762-
- その他
705+
### 型・フォーマット
763706

764-
- 正規表現で表現できる文字列は`pattern`を利用して定義する。桁や区分値で代替できる場合は、`pattern` を用いない
765-
- :
707+
型(`type`)は `string(文字列)`, `number(数値)`, `integer(整数値)`, `boolean(真偽値)` `array(配列)`, `file(ファイル)` のうちどれか指定する.
766708

767-
```yaml
768-
remind_time:
769-
type: string
770-
description: リマインド時刻。(hh:mm)形式
771-
example: 23:59
772-
pattern: "^(2[0-3]|[01][0-9]):([0-5][0-9])$"
773-
```
709+
フォーマット(`format`) は以下の型の詳細情報を示すもので、可能な限り設定する。
710+
711+
- `integer` (整数)
712+
- `int32`, `int64`
713+
- `number` (数値)
714+
- `float`, `double`
715+
- `string` (バイナリ)
716+
- `byte`: Base64 でエンコードされた文字列
717+
- `binary`: バイト配列
718+
- `string` (日付)
719+
- `date`: [RFC3339](https://www.rfc-editor.org/rfc/rfc3339) full-date(例: 2023-07-21)
720+
- 項目名は `_on` を接尾辞につけることを推奨とする
721+
- `date-time`: [RFC3339](https://www.rfc-editor.org/rfc/rfc3339) date-time(例: 2023-07-21T17:32:28Z)
722+
- 項目名は `_at` を接尾辞につけることを推奨とする
723+
- `string` (その他)
724+
- `password`: Swagger UI で入力が隠される
725+
- その他、 `email`, `uuid` など Open API 仕様に存在しない任意のフォーマットを独自のドキュメント生成などのために記載しても良い
726+
727+
### 桁
728+
729+
データ型によって、利用できる桁を指定する項目が異なる。可能な限り設定する。
730+
731+
- 文字列
732+
- 最大桁数:`maxLength`
733+
- 最小桁数:`minLength`
734+
- 数値または整数値
735+
- 最小値(境界値を含む):`minimum`
736+
- 最大値(境界値を含む):`maximum`
737+
- 境界値を含まない場合のみ`exclusiveMinimum: true`または`exclusiveMaximum: true`を定義する。minimum, maximum で代用できる場合は利用しない
738+
- 配列:
739+
- 最大要素数:`maxItems`
740+
- 最小要素数:`minItems`
741+
- `required: true`の場合は原則として`minItems: 1`を定義する
742+
- `uniqueItems` は必須で指定する(通常は一意であるべき)
743+
744+
【注意】API 公開後に、レスポンスの `maxLength` を以前より大きい値に変更してはならない。レスポンスの `maxLength` など API 利用者側システムの DB の ERD 定義のインプットになる事が多いため。もし行う場合は API のバージョンを上げることや、連携先に桁数変更の旨を調整するなどの考慮を行う。
745+
746+
### 区分値
747+
748+
区分値の場合は `enum` 属性を利用し、`description`には区分値の論理名を記載する。
749+
750+
```yaml
751+
name: gender
752+
type: string
753+
enum: ["0", "1", "2", "9"]
754+
description: |
755+
性別
756+
0: 不明
757+
1: 男
758+
2: 女
759+
9: 適用不能
760+
```
761+
762+
### 固定値
763+
764+
**固定値** の場合も enum を 1 つだけ指定して表現する。この場合もレスポンスで利用する場合は指定しない
765+
766+
```yaml
767+
name: file_layout
768+
type: string
769+
enum: ["json"]
770+
description: ファイルレイアウト
771+
```
772+
773+
### その他(正規表現)
774+
775+
正規表現で表現できる文字列は`pattern`を利用して定義する。桁や区分値で代替できる場合は、`pattern` を用いない
776+
777+
:
778+
779+
```yaml
780+
remind_time:
781+
type: string
782+
description: リマインド時刻。(hh:mm)形式
783+
example: 23:59
784+
pattern: "^(2[0-3]|[01][0-9]):([0-5][0-9])$"
785+
```
774786

775787
## ファイルアップロード
776788

@@ -838,6 +850,15 @@ CORS(Cross-Origin Resource Sharing)のために、options メソッドの追
838850

839851
[^1]: https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/enable-cors-for-resource-using-swagger-importer-tool.html
840852

853+
## OpenTelemetry Traceparent HTTP Header
854+
855+
OpenOpenTelemetryで用いるられる[traceparent](https://www.w3.org/TR/trace-context/) のリクエストヘッダーはOpenAPIで **原則不要** とする。
856+
857+
理由は以下である。
858+
859+
- OpenTelemetryが定めるヘッダー類は、API横断的に設定されるべきものであり、ミドルウェアやフレームワーク側などでの一律の制御を推奨するため
860+
- 記載することにより、OpenOpenTelemetryに対応していることを明記し開発者に周知できるメリットより、各アプリ開発者が生成されたコードで悩んだり、誤解されることを回避したいため
861+
841862
## API のバージョン管理
842863

843864
Swagger 定義で以下の変更を行う場合は、利用するコード生成の動作によってはクライアントにとって互換性を失う破壊的変更であることがあるため、変更は調整の上で行うか、バージョンを上げることを考える。

0 commit comments

Comments
 (0)