スキーマ駆動における検証を考察する
経緯
react & cakephp で開発していてリクエストとレスポンスの整合性を維持する方法はないかと気になり調べた。
- フロントエンドから投げるリクエスト
- それを受け取ったバックエンド
- フロントエンドに返すレスポンス
- これを受け取るフロントエンド
これらに対するアプローチとして openapi3 と json schema があり、openapi3 にフォーカスをあてて記す。20241009 時点で openapi3 では json schema draft5 だがこれは独自の仕様で実質は draft4 であり json schema 本来の機能性(2020-12)を網羅できていない。これを踏まえて openapi3 はリクエストとレスポンスのヘッダの検証を含んでいるがそこまでは必要ない。
非対応のキーワード
20241009 に時点で表記されているもの
- $schema
- additionalItems
- const
- contains
- dependencies
- id
- $id
- patternProperties
- propertyNames
不確実性が発生する
例として全国地方公共団体コードを使用して例を上げる。
type labelValue = {

	label :string,

	value :string,

}



type areas = {

	// 都道府県コード 数字二桁の文字列

	states :[labelValue, ...labelValue[]],



	// 市区町村コード 数字六桁の文字列

	cities :{

		[K in areas['states'][number]['value']] :[labelValue, ...labelValue[]]

	}

}
patternProperties、propertyNames が使えず areas['cities'] の Map オブジェクトのキーとバリューのうちキーに対して制約を与えることができず、 additionalProperties でバリューだけを定義することになる。
このためだけに cities を states 配下のプロパティにするのもあほらしい。