第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 データ型の属性」 にリストされています。

表3.1 part データ型の属性

属性説明

element="elem_name"

パーツのデータ型は、elem_name という要素によって定義されます。

type="type_name"

part のデータ型は、type_name と呼ばれる型によって定義されます。

メッセージは part の名前を再利用できます。たとえば、メソッドに参照によって渡されるか、または入力/出力であるパラメーター foo がある場合、例3.1「再利用部分」 のように要求メッセージと応答メッセージの両方の一部にすることができます。

例3.1 再利用部分

<message name="fooRequest">
  <part name="foo" type="xsd:int"/>
<message>
<message name="fooReply">
  <part name="foo" type="xsd:int"/>
<message>

たとえば、個人情報を保存し、従業員の ID 番号に基づいて従業員のデータを返すメソッドを提供するサーバーがあるとします。データを検索するためのメソッドシグネチャーは、例3.2「personalInfo ルックアップメソッド」 のようになります。

例3.2 personalInfo ルックアップメソッド

personalInfo lookup(long empId)

このメソッドシグネチャーは、例3.3「RPC WSDL メッセージ定義」 に示す RPC スタイルの WSDL フラグメントにマッピングできます。

例3.3 RPC WSDL メッセージ定義

<message name="personalLookupRequest">
  <part name="empId" type="xsd:int"/>
<message/>
<message name="personalLookupResponse>
  <part name="return" element="xsd1:personalInfo"/>
<message/>

また、例3.4「ラップされたドキュメントの WSDL メッセージ定義」 に示すラップされたドキュメントスタイルの WSDL フラグメントにマップすることもできます。

例3.4 ラップされたドキュメントの WSDL メッセージ定義

<wsdl:types>
  <xsd:schema ... >
  ...
  <element name="personalLookup">
    <complexType>
      <sequence>
        <element name="empID" type="xsd:int" />
      </sequence>
    </complexType>
  </element>
  <element name="personalLookupResponse">
    <complexType>
      <sequence>
        <element name="return" type="personalInfo" />
      </sequence>
    </complexType>
  </element>
  </schema>
</types>
<wsdl:message name="personalLookupRequest">
  <wsdl:part name="empId" element="xsd1:personalLookup"/>
<message/>
<wsdl:message name="personalLookupResponse">
  <wsdl:part name="return" element="xsd1:personalLookupResponse"/>
<message/>