Menu Close

第3章 サービスで使用される論理メッセージの定義

概要

サービスは、操作が呼び出されたときに交換されるメッセージによって定義されます。WSDL コントラクトでは、これらのメッセージは message 要素を使用して定義されます。メッセージは、part 要素を使用して定義される 1 つ以上のパーツで構成されます。

概要

サービスの操作は、オペレーションの呼び出し時に交換される論理メッセージを指定して定義します。これらの論理メッセージは、ネットワーク上に渡されたデータを XML ドキュメントとして定義します。これには、メソッド呼び出しの一部であるすべてのパラメーターが含まれます。 論理メッセージは、コントラクトの message 要素を使用して定義されます。各論理メッセージは、part 要素で定義された 1 つ以上のパーツで構成されます。

メッセージごとに各パラメーターを個別部分として一覧表示できますが、操作に必要なデータをカプセル化する 1 つの部分のみを使用することが推奨されます。

メッセージおよびパラメーターリスト

サービスによって公開される各操作には、1 つの入力メッセージと 1 つの出力メッセージのみを指定できます。入力メッセージは、操作が呼び出されたときにサービスが受信するすべての情報を定義します。出力メッセージは、操作の完了時にサービスが返すすべてのデータを定義します。障害メッセージは、エラーが発生した際にサービスが返すデータを定義します。

さらに、各操作は任意の数の障害メッセージを指定できます。障害メッセージは、サービスでエラーが発生したときに返されるデータを定義します。これらのメッセージには通常、コンシューマーがエラーを理解するために十分な情報を提供するパーツが 1 つのみ含まれます。

レガシーシステムとの統合に関するメッセージ設計

既存のアプリケーションをサービスとして定義する場合は、メソッドの操作の実装で使用される各パラメーターがメッセージで表されるようにする必要があります。また、戻り値が操作の出力メッセージに含まれていることを確認する必要があります。

メッセージを定義する方法の 1 つは RPC スタイルです。RPC スタイルを使用する場合、メソッドのパラメーターリストの各パラメーターに 1 つのパーツを使用してメッセージを定義します。各メッセージパーツは、コントラクトの types 要素で定義された型に基づきます。入力メッセージには、メソッドの入力パラメーターごとに 1 つのパーツが含まれます。アウトプットメッセージには、出力パラメーターごとに 1 つの部分が含まれ、また必要に応じて戻り値を表す部分が含まれます。パラメーターが入力パラメーターと出力パラメーターの両方である場合、これは入力メッセージと出力メッセージの両方のパーツとして一覧表示されます。

RPC スタイルのメッセージ定義は、Tibco や CORBA などのトランスポートを使用するレガシーシステムを有効にする場合に便利です。これらのシステムは、手順と方法を中心にして設計されています。そのため、呼び出される操作のパラメーターリストに似たメッセージを使用してモデル化するのが最も簡単です。RPC スタイルは、サービスと、公開しているアプリケーションとの間のよりクリーンなマッピングを作成します。

SOAP サービスのメッセージ設計

RPC スタイルは、既存のシステムをモデリングに便利ですが、サービスのコミュニティーではラップされたドキュメントスタイルが強く優先されます。ラップされたドキュメントスタイルでは各メッセージに 1 つのパーツがあります。メッセージのパーツは、コントラクトの types 要素で定義されたラッパー要素を参照します。wrapper 要素には、以下の特徴があります。

  • 要素シーケンスが含まれる複合型です。詳細は 「複合データ型の定義」 を参照してください。
  • 入力メッセージのラッパーの場合:

    • メソッドの入力パラメーターごとに 1 つの要素があります。
    • 名前は、関連付けられた操作の名前と同じです。
  • 出力メッセージのラッパーの場合:

    • メソッドの出力パラメーターごとに 1 つの要素があり、メソッドの inout パラメーターごとに 1 つの要素があります。
    • 最初の要素は、メソッドの戻りパラメーターを表します。
    • この名前は、ラッパーが関連付けられる操作の名前に Response を追加して生成されます。

メッセージの命名

コントラクトの各メッセージには、その namespace 内で一意となる名前を指定する必要があります。以下の命名規則を使用することが推奨されます。

  • メッセージは単一の操作でのみ使用する必要があります。
  • 入力メッセージ名は、操作名の前に Request を追加して形成されます。
  • 出力メッセージ名は、操作名の前に Response を追加して形成されます。
  • 障害メッセージ名は、障害の理由を表す必要があります。

メッセージ部分

メッセージ部分は、論理メッセージの正式のデータユニットです。各部分は part 要素を使用して定義され、name 属性と、データ型を指定する type 属性または element 属性によって識別されます。データ型属性は 表3.1「パーツデータ型属性」 に記載されています。

表3.1 パーツデータ型属性

属性説明

element="elem_name"

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

type="type_name"

パーツのデータ型は、type_name という型で定義されます。

メッセージは、パーツ名を再利用できます。たとえば、メソッドに参照により渡されるパラメーターまたは in/out の 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/>