スキーマレジストリの例 - 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 メッセージは拒否されません。非準拠メッセージを拒否または破棄するには、スキーマ検証 を使用してください。