クラウド・ベースのアプリケーションを対象とした JSON ペイロードの妥当性検証と変換を動的に行う

この記事では、クラウドのコンシューマーとクラウド・サービス・プロバイダーの便宜を図るために JSON (JavaScript Object Notation) の妥当性検証と変換を容易にするソリューション・アーキテクチャーを紹介します。JVAX (JSON Verification and Conversion/Transformation) システムは、クラウド・サービスに送られてくるすべてのリクエストを、クラウド・サービスが受信する前に処理するシステムです。JVAX は、API リクエストのペイロードが JSON であるときに発生する可能性のある一般的な問題に対処するように設計されています。

Bharat Purohit, Software Engineer, IBM

Bharat Purohit photoBharat Bhushan Purohit は、これまでさまざまな Web テクノロジーに取り組んできており、ソフトウェア業界での経験は 9 年を超えます。現在、彼はクラウド・プラットフォーム・チームの主任開発者であり、クラウドに関する特許もいくつか持っています。



Sarang Ratnalikar, Software Engineer, IBM

Sarang Ratnalikar photoSarang Deepak Ratnalikar は、ソフトウェア・エンジニアであり、業界での経験は 9 年を超えます。現在、彼は IBM クラウド・プラットフォーム・チームの一員であり、J2EE での開発、ビルド、等々さまざまなアクティビティーを担当しています。



2013年 10月 31日

基本用語

  • JSON: 構造化データを送信するために設計された、テキスト・ベースのオープン・スタンダード。Web アプリケーションと Web サーバーの間でのデータ転送で最も一般的に使用されているのは JSON です。
  • JSON ペイロード: REST API 用に JSON フォーマットが使用された POST/PUT リクエスト本体。
  • JSON スキーマ: JSON ペイロードに適用する妥当性検証ルールと変換ルールを記述するものです。

この記事で紹介するのは、クラウド・サービスとそのコンシューマーとのやりとりにおいて JSON (JavaScript Object Notation) ペイロードの妥当性検証と変換が必要な場合に、発生し得る問題に対処するためのソリューション・アーキテクチャーです。この JVAX (JSON Verification and Conversion/Transformation) と名付けられたアーキテクチャーは、妥当性検証および変換に応じて構成可能な JSON スキーマを使用します。

JSON ペイロードを使用するクラウド・アプリケーションの開発ライフサイクルには、頻繁なアップグレードと統合を伴うのが一般的です。ユース・ケースを追加、あるいは変更するたびに、アプリケーションの JSON 妥当性検証および変換ロジックを変更しなければならないこともあります。その結果、アプリケーションが次第に脆弱になり、エラーも発生しやすくなって、アプリケーションの保守も煩雑になってきます。

通常、REST (Representational State Transfer) API を提供するクラウド・サービスでは、JSON ペイロードの妥当性検証および変換に関する作業はかなりの量になります。JVAX アーキテクチャーは、クラウド・サービスとは独立して JSON ペイロードを妥当性検証、変換するように設計されています。この設計により、JVAX システムは、サービス・プロバイダーが行わなければならない、リクエストの妥当性検証の処理量を軽減します。さらに JVAX は、JVAX を使用するアプリケーションの信頼性と保守性を高める上でも役に立ちます。

JVAX では、洗練されたメカニズムを使用してペイロード・ルールを記述します。JVAX の構成体を紹介するために、これから 1 つの例を取り上げます。

JVAX のスキーマ定義

単純な JSON ペイロードの例として、リスト 1 に Person オブジェクトを記載します。

リスト 1. Person オブジェクトに対する入力データの例
"Person": {
  "FirstName" : "Krishna",
  "LastName" : "Yadav"
  "Age" : 25,
  "PhoneNumber" : "91-012-3456789"
}

リスト 2 に、リスト 1 の Person オブジェクトに対する JSON スキーマの基本的な例を記載します。

リスト 2. JVAX での Person オブジェクトのスキーマ定義
{
  "Person" : {
    "type" : "object",
    "properties" : {
      "FirstName" : {
        "type" : "string",
        "category" : "MANDATORY"
      },
      "LastName" : {
        "type" : "string",
        "category" : "MANDATORY"
      },
      "Age" : {
        "type" : "number",
        "category" : "MANDATORY"
      },
      "PhoneNumber" : {
        "type" : "string",
        "category" : "OPTIONAL"
      }
    }
  }}

リスト 2 の JSON スキーマは、Person オブジェクトのフィールドを各種データ型の観点で記述しています。表 1 に、JVAX でサポートしているデータ型を記載します。

表 1. サポートされる JVAX のフィールド型
サポートされる型入力値
stringjava.lang.String でサポートされているのと同様の、二重引用符で囲まれたストリング値
"type" : "string"
booleantrue または false
"type" : "boolean"
object順序付けられたキー/値ペアのコレクション。
properties 指定子にキー/値ペアの記述が保持されます。
"type" : "object",
"properties" : {
// description of the collection
}
array順序付けられた一連の値 (基本型またはその他のオブジェクト型の値にすることができます)。
配列に含まれる要素はすべて同じ型であると見なされます。
items 指定子に、配列の記述が保持されます。
"type" :"array","items" : {
// description of array elements
}
numberjava.lang.number でサポートされているのと同様の数値
"type" : "number"

ペイロードに含まれるすべてのフィールドには値が必要です。また上記スキーマでは、各フィールドに対して 1 つの category を適用します。カテゴリーは、(アプリケーション・コードのビジネス・ロジックに実装された) 内部ルールを使用して、JVAX でのフィールド値の処理方法を決定します。これらのルールにより、値を上書きする方法がサポートされます。このことは、呼び出し側によって無効な値が設定されるのを防ぐには特に重要です。表 1 に、JVAX のカテゴリーとそれぞれのカテゴリーに関連付けられている処理ルールを記載します。

表 2. JVAX のカテゴリーおよび関連付けられている処理ルール
カテゴリー説明 (API コンシューマー用)内部処理ルール (「はい」= 値が入力に含まれている) (「いいえ」= 値が入力に含まれていない)
MANDATORYAPI リクエストが値を提供しなればなりません。
  • 「はい」の場合、その値を使用します。
  • 「いいえ」の場合、エラーが発生します。
OPTIONALAPI リクエストによる値の提供はオプションです。値が提供されていない場合は、デフォルト値が使用されます。
  • 「はい」の場合、その値を使用します。
  • 「いいえ」の場合、スキーマでデフォルト値が指定されていれば、その値を使用します。
  • 「いいえ」の場合、スキーマでデフォルト値が指定されていなければ、処理は行われません。
RESERVED内部専用のフィールドです。API リクエストの入力値はすべて無視され、スキーマで指定されている内部デフォルト値で置き換えられます。
  • 「はい」の場合、デフォルト値で上書きします。
  • 「いいえ」の場合、新規に作成してデフォルト値を取り込みます。
(いずれの場合もエラーは発生しません。)
SUPPRESSED値が指定されていても、その値は無視されます。
  • 「はい」の場合、値を削除します。
  • 「いいえ」の場合、処理は行われません。

スキーマには、列挙型、正規表現、およびカスタム妥当性検証メカニズムを使用することもできます。さらに、スキーマは共有オブジェクト定義を参照できるため、JVAX によってコードの再利用が促されることになります。


JVAX の設計

JVAX の設計における主な概念は、リクエストは JVAX システムを経由してからサービス・プロバイダーによって処理されることです。図 1 に、JVAX のコンポーネントおよびそれらの相互関係の概要を示します。

図 1. JVAX の概要
JVAX のコンポーネントおよびそれらの相互関係の概要

図 1 に反映されている基本ステップは以下のとおりです。

  1. JVAX システムで、サービス・プロバイダーが API ペイロードのテンプレートとして機能する JSON スキーマを定義します。
  2. コンシューマーが API を使用して、JSON ペイロードを JVAX システムに送信します。
  3. 定義されたスキーマに従って、JVAX が入力ペイロードを妥当性検証および変換します。
  4. エラー条件が発生した場合、JVAX がプロバイダーに代わってコンシューマーに応答します。
  5. 妥当性検証に通ると、JVAX はリクエストをサービス・プロバイダーにリダイレクトします。

JSON スキーマの設計

JSON スキーマを定義するプロセスは、以下のステップからなります。

  1. サービス・プロバイダーが、API とその API に関連するペイロードのフィールドを定義します。
  2. サービス・プロバイダーが、これらのAPI ペイロードのフィールドを反映した JSON スキーマを定義します。
  3. サービス・プロバイダーが、以下のルールに従ってフィールドのデータ型を定義します。
    • API の必須フィールドには、サービス・プロバイダーが MANDATORY のフラグを立てます。
    • 必須でないフィールドには、OPTIONAL のフラグを立てます。
    • 常に特定の値のセットを持つフィールドには、RESERVED のフラグを立てます。
    • フィールドの値を API に渡さない場合には、そのフィールドに SUPPRESSED のフラグを立てます。

図 2 に、JSON スキーマを設計するために必要なすべてのステップを示します。

図 2. JSON スキーマを設計するためのステップ
図 2 に示されているステップは以下のとおりです。1. JSON ペイロード・スキーマを作成します。2. API 呼び出しおよび JSON ペイロードを検査します。3. フィールドのカテゴリー (MANDATORY、OPTIONAL、RESERVED、SUPPRESSED) を識別します。4. フィールドのデータ型およびカスタム妥当性検証を識別します。5. 認識されていない JSON 構成体に対するポリシーを決定します。

JVAX のオンボード・プロセス

図 3 に、JVAX システムのオンボード・プロセスを示します。

図 3. JVAX のオンボード・プロセス
JVAX システムのオンボード・プロセスの画像

図 3 に示されているプロセスの内容は以下のとおりです。

  1. JVAX スキーマが、サービス・コンシューマーから提供された JSON ペイロードを読み込みます。
  2. JVAX は、サービス・プロバイダーがその特定の API に指定している JSON スキーマを読み込みます。
  3. JVAX が JSON スキーマの妥当性検証を試行します。エラーが発生した場合、エラー条件を返して停止します。
  4. スキーマが有効な場合、JVAX は定義された JSON スキーマに照らし合わせて JSON ペイロードの妥当性検証を行います。ペイロードが JSON スキーマのシグニチャーと一致しなければ、エラー条件を返して停止します。
  5. ペイロードの妥当性検証でエラーが発生しなかった場合、JVAX は (オプションで) API 要件に従って入力 JSON ペイロードを変換します。
  6. サービス・プロバイダーのベース・フレームワークが API を呼び出し、その API を使用してサービス・コンシューマーにレスポンスを送信します。

構成オプション

JVAX システム全体をスタンドアロン構成にすることも、あるいは組み込み構成にすることもできます。スタンドアロン構成の場合、JVAX はクラウド・サービスとは切り離してインストールされ、単独のプロセスとして実行されます。組み込み構成の場合には、JVAX が既存のアプリケーションに組み込まれるため、JVAX とそのアプリケーションが同じプロセス空間を共有することになります。組み込み構成では、JVAX を簡単にデプロイして構成できるだけでなく、ハードウェアの不要な構成コストも回避されます。


JVAX の利点

JVAX ソリューション・アーキテクチャーには、以下の利点があります。

  • 構成の容易さ: JVAX のルール・ベースの手法は、頻繁に変更される可能性があるビジネス・ルールを課しやすくします。
  • プラガビリティーおよび拡張性: JVAX のルール・ベースの手法は、実際のサービスや既存のプロキシーの内部に組み込むことが可能です。あるいは、ペイロードをインターセプトして検査するスタンドアロンのプロキシーとして追加することもできます。
  • 保守の容易さ: 必要なのは構成の変更だけです。サービス自体を再デプロイする必要はありません。
  • 効率性: リクエストは、有効でない限り API に到達しません。これにより、不要な処理のオーバーヘッドがサービス・プロバイダーから取り除かれます。
  • バージョン管理サポート: JVAX により、システムの内部構造がサービス・プロバイダーによって変更されたとしても、外部インターフェースの互換性を簡単に維持することができます。
  • ドキュメント・サポート: スキーマ情報を直接 API ドキュメントに変換することができます。

まとめ

JSON は、クライアント・アプリケーションと Web サーバーとの間でのデータ送信に広く使用されていることから、クラウドでは JSON の妥当性検証と変換がますます重要になってきています。JAVX システムは、サービス・プロバイダーとサービス・コンシューマーの両方にメリットをもたらし得るシステムです。JAVX システムは構成可能であるため、サービス・プロバイダーは JSON フォーマットの各種ペイロードの処理に伴う保守作業を軽減することができます。一方、サービス・コンシューマーは、簡単に JVAX システムからのレスポンスを確認して、必要に応じて JSON ペイロードを変更することができます。

参考文献

学ぶために

  • JSON: ウィキペディアで JSON について読んでください。
  • JSON Schema: 現在、IETF のドラフト・ステータスである JSON Schema の仕様では、JSON データの構造を定義するための JSON ベースのフォーマットを定義しています。
  • jsin-schema.org: JSON Schema の仕様についての詳しい情報を得るために、このサイトにアクセスしてください。
  • developerWorks の Cloud computing ゾーンを調べてください。ここでは、コミュニティーによる貴重なディスカッションを見つけることや、クラウドに関連する新しい技術リソースについて学習することができます。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、Wiki を調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Java technology
ArticleID=950164
ArticleTitle=クラウド・ベースのアプリケーションを対象とした JSON ペイロードの妥当性検証と変換を動的に行う
publish-date=10312013