スキーマレジストリの例 - JSON Schema
このページでは、スキーマレジストリに draft 2020-12 JSON Schema を登録し、ルール内で schema_check 関数を使って MQTT メッセージのペイロードを検証する方法を示します。この例では、スキーマに準拠したペイロードのみを再パブリッシュします。
対応している JSON Schema ドラフト
EMQX 6.0.4 以降、スキーマレジストリは以下の JSON Schema ドラフトをサポートしています:
- draft-03
- draft-04
- draft-06
- draft 2019-09
- draft 2020-12
EMQX は $schema フィールドの値に基づいて JSON Schema のバージョンを選択します。$schema が省略された場合は draft-06 を使用します。
draft 2019-09 と draft 2020-12 のサポートには以下の制限があります:
- draft 2019-09 は
$recursiveRefをサポートしません。 - draft 2020-12 は
$dynamicRefをサポートしません。 - これら2つのドラフトではリモートスキーマへの参照はサポートされていません。
サポートされていないキーワードをスキーマが使用している場合、検証はキーワードを無視するのではなくエラーを返します。
JSON Schema の作成
整数がちょうど2つ含まれる配列を受け入れるスキーマを作成します:
EMQX ダッシュボードの左側ナビゲーションメニューで Smart Data Hub -> Schema Registry をクリックします。
Internal タブで Create をクリックします。
以下の項目を設定します:
Name:
json_arrayと入力します。Type: JSON Schema を選択します。
Schema: 以下の draft 2020-12 スキーマを入力します:
json{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "array", "prefixItems": [ { "type": "integer" }, { "$ref": "#/prefixItems/0" } ], "minItems": 2, "maxItems": 2 }
Create をクリックします。
prefixItems 配列は各位置のスキーマを定義します。ローカルの $ref により、2番目の要素は1番目の要素と同じ整数スキーマを使用します。minItems と maxItems により、ペイロードはちょうど2つの要素を含む必要があります。
ルールの作成
ペイロードが json_array に準拠する場合のみメッセージを再パブリッシュするルールを作成します:
ダッシュボードの左側ナビゲーションメニューで Integration -> Rules をクリックします。
Rules ページで Create をクリックします。
Name フィールドに
validate_json_arrayと入力します。SQL Editor に以下のステートメントを入力します:
sqlSELECT * FROM "t/json" WHERE schema_check('json_array', payload)schema_check関数はペイロードがjson_arrayに準拠する場合にtrueを返します。そうでない場合はfalseを返し、ルールはアクションを実行しません。Add Action をクリックし、Republish を選択します。
Topic フィールドに
validated/json、Payload フィールドに${payload}と入力します。Create をクリックします。
ルールのテスト
MQTTX CLI を使ってルールを検証します:
再パブリッシュ先のトピックをサブスクライブします:
bashmqttx sub -t validated/json別のターミナルで、スキーマに準拠したペイロードをパブリッシュします:
bashmqttx pub -t t/json -m '[1, 2]'サブスクライバーは
validated/jsonトピックから[1, 2]を受信します。2番目の要素が整数でないペイロードをパブリッシュします:
bashmqttx pub -t t/json -m '[1, "two"]'ルールは再パブリッシュアクションを実行せず、サブスクライバーはメッセージを受信しません。
ルール内で schema_check を使うとルールの実行をフィルタリングできますが、元の MQTT メッセージは拒否されません。非準拠メッセージを拒否または破棄するには、スキーマ検証 をご利用ください。