第3章 サービスで使用される論理メッセージの定義
概要
サービスは、その操作が呼び出されたときに交換されるメッセージによって定義されます。WSDL コントラクトでは、これらのメッセージは message
要素を使用して定義されます。メッセージは、part
要素を使用して定義される 1 つ以上のパーツで設定されます。
概要 リンクのコピーリンクがクリップボードにコピーされました!
サービスの操作は、操作が呼び出されたときに交換される論理メッセージを指定することによって定義されます。これらの論理メッセージは、ネットワークを介して渡されるデータを XML ドキュメントとして定義します。これらには、メソッド呼び出しの一部であるすべてのパラメーターが含まれています。 論理メッセージは、コントラクトの message
要素を使用して定義されます。各論理メッセージは、part
要素で定義された 1 つ以上のパーツで設定されます。
メッセージには各パラメーターを個別の部分としてリストできますが、推奨される方法は、操作に必要なデータをカプセル化する単一の部分のみを使用することです。
メッセージおよびパラメーターリスト リンクのコピーリンクがクリップボードにコピーされました!
サービスによって公開される各操作は、1 つの入力メッセージと 1 つの出力メッセージのみを持つことができます。入力メッセージは、操作が呼び出されたときにサービスが受け取るすべての情報を定義します。出力メッセージは、操作が完了したときにサービスが返すすべてのデータを定義します。障害メッセージは、エラーが発生したときにサービスが返すデータを定義します。
さらに、各操作には任意の数の障害メッセージを含めることができます。障害メッセージは、サービスでエラーが発生したときに返されるデータを定義します。これらのメッセージには通常、コンシューマーがエラーを理解するのに十分な情報を提供する部分が 1 つだけあります。
レガシーシステムと統合するためのメッセージデザイン リンクのコピーリンクがクリップボードにコピーされました!
既存のアプリケーションをサービスとして定義する場合は、操作を実装するメソッドで使用される各パラメーターがメッセージで表されていることを確認する必要があります。また、戻り値が操作の出力メッセージに含まれていることを確認する必要があります。
メッセージを定義するための 1 つのアプローチは、RPC スタイルです。RPC スタイルを使用する場合は、メソッドのパラメーターリストのパラメーターごとに 1 つの部分を使用してメッセージを定義します。各メッセージパーツは、コントラクトの types
要素で定義された型に基づきます。入力メッセージには、メソッドの入力パラメーターごとに 1 つの部分が含まれています。出力メッセージには、出力パラメーターごとに 1 つの部分と、必要に応じて戻り値を表す部分が含まれます。パラメーターが入力パラメーターと出力パラメーターの両方である場合、それは入力メッセージと出力メッセージの両方の一部としてリストされます。
RPC スタイルのメッセージ定義は、Tibco や CORBA などのトランスポートを使用するレガシーシステムをサービス対応にする場合に役立ちます。これらのシステムは、手順と方法を中心に設計されています。そのため、呼び出される操作のパラメーターリストに似たメッセージを使用してモデル化するのが最も簡単です。RPC スタイルは、サービスとそれが公開しているアプリケーションの間のよりクリーンなマッピングも作成します。
SOAP サービスのメッセージデザイン リンクのコピーリンクがクリップボードにコピーされました!
RPC スタイルは既存のシステムのモデリングに役立ちますが、サービスのコミュニティーはラップされたドキュメントスタイルを強く支持しています。ラップされたドキュメントスタイルでは、各メッセージは 1 つの部分で設定されます。メッセージのパーツは、コントラクトの types
要素で定義されたラッパー要素を参照します。ラッパー要素には次の特徴があります。
- これは、一連の要素を含む複合型です。詳細は、「複雑なデータ型の定義」 を参照してください。
入力メッセージのラッパーの場合:
- メソッドの入力パラメーターごとに 1 つの要素があります。
- その名前は、関連付けられている操作の名前と同じです。
出力メッセージのラッパーの場合:
- メソッドの出力パラメーターごとに 1 つの要素があり、メソッドの inout パラメーターごとに 1 つの要素があります。
- その最初の要素は、メソッドの戻りパラメーターを表します。
-
この名前は、ラッパーが関連付けられる操作の名前に
Response
を追加して生成されます。
メッセージの命名 リンクのコピーリンクがクリップボードにコピーされました!
コントラクト内の各メッセージは、その名前空間内で一意の名前を持っている必要があります。次の命名規則を使用することを推奨します。
- メッセージは、1 回の操作でのみ使用する必要があります。
-
入力メッセージ名は、操作名の前に
Request
を追加して形成されます。 -
出力メッセージ名は、操作名の前に
Response
を追加して形成されます。 - 障害メッセージ名は、障害の理由を表す必要があります。
メッセージ部分 リンクのコピーリンクがクリップボードにコピーされました!
メッセージ部分は、論理メッセージの正式なデータ単位です。各パーツは part
要素を使用して定義され、name
属性と、データ型を指定する type
属性または element
属性によって識別されます。データ型の属性は、表3.1「part データ型の属性」 にリストされています。
属性 | 説明 |
---|---|
パーツのデータ型は、elem_name という要素によって定義されます。 | |
part のデータ型は、type_name と呼ばれる型によって定義されます。 |
メッセージは part の名前を再利用できます。たとえば、メソッドに参照によって渡されるか、入力/出力であるパラメーター foo
がある場合、例3.1「再利用部分」 のように要求メッセージと応答メッセージの両方の一部にすることができます。
例3.1 再利用部分
例 リンクのコピーリンクがクリップボードにコピーされました!
たとえば、個人情報を保存し、従業員の ID 番号に基づいて従業員のデータを返すメソッドを提供するサーバーがあるとします。データを検索するためのメソッドシグネチャーは、例3.2「personalInfo ルックアップメソッド」 のようになります。
例3.2 personalInfo ルックアップメソッド
personalInfo lookup(long empId)
personalInfo lookup(long empId)
このメソッドシグネチャーは、例3.3「RPC WSDL メッセージ定義」 に示す RPC スタイルの WSDL フラグメントにマッピングできます。
例3.3 RPC WSDL メッセージ定義
また、例3.4「ラップされたドキュメントの WSDL メッセージ定義」 に示すラップされたドキュメントスタイルの WSDL フラグメントにマップすることもできます。
例3.4 ラップされたドキュメントの WSDL メッセージ定義