6.2. SOAP1.1 バインディングへの SOAP ヘッダーの追加

概要

SOAP ヘッダーは、soap:header 要素をデフォルトの SOAP 1.1 バインディングに追加して定義されます。soap:header 要素は、バインディングの inputoutput、および fault 要素の任意の子です。SOAP ヘッダーは親メッセージの一部になります。SOAP ヘッダーは、メッセージとメッセージ部分を指定することによって定義されます。各 SOAP ヘッダーにはメッセージ部分を 1 つだけ含めることができますが、必要な数の SOAP ヘッダーを挿入できます。

構文

SOAP ヘッダーを定義するための構文を 例6.3「SOAP ヘッダー構文」 に示します。soap:headermessage 属性は、ヘッダーに挿入される部分が取得されたメッセージの修飾名です。part 属性は、SOAP ヘッダーに挿入されたメッセージ部分の名前です。SOAP ヘッダーは常にドキュメントスタイルであるため、SOAP ヘッダーに挿入される WSDL メッセージ部分は要素を使用して定義する必要があります。messagepart 属性はともに、SOAP ヘッダーに挿入するデータを完全に記述します。

例6.3 SOAP ヘッダー構文

<binding name="headwig">
  <soap:binding style="document"
                transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="weave">
      <soap:operation soapAction="" style="document"/>
      <input name="grain">
        <soap:body ... />
        <soap:header message="QName" part="partName"/>
      </input>
...
</binding>

必須の messagepart 属性と同様に、soap:header は、namespaceuse、および encodingStyle 属性もサポートします。これらの属性は soap:body の場合と同様に soap:header でも機能します。

本文とヘッダーの間でメッセージを分割

SOAP ヘッダーに挿入されるメッセージ部分は、コントラクトからの任意の有効なメッセージ部分にすることができます。これは、SOAP 本体として使用されている親メッセージの一部である場合もあります。同じメッセージで情報を 2 回送信する可能性は低いため、SOAP バインディングは、SOAP 本文に挿入されるメッセージ部分を指定する手段を提供します。

soap:body 要素には、部分名のスペース区切りリストを取る任意の属性 parts があります。parts が定義されると、リストされたメッセージ部分のみが SOAP ボディーに挿入されます。その後、残りの部分を SOAP ヘッダーに挿入できます。

注記

親メッセージの一部を使用して SOAP ヘッダーを定義すると、Apache CXF が自動的に SOAP ヘッダーを入力します。

例6.4「SOAP 1.1 SOAP ヘッダーを使用したバインド」 は、例6.1「注文システムインターフェイス」 に示されている orderWidgets サービスの変更バージョンを示しています。このバージョンが変更され、各注文のリクエストおよび応答の SOAP ヘッダーに xsd:base64binary 値が配置されます。SOAP ヘッダーは、widgetKey メッセージの keyVal 部分として定義されます。この場合、SOAP ヘッダーは入力メッセージまたは出力メッセージの一部ではないため、アプリケーションロジックに SOAP ヘッダーを追加する必要があります。

例6.4 SOAP 1.1 SOAP ヘッダーを使用したバインド

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="widgetOrderForm.wsdl"
    targetNamespace="http://widgetVendor.com/widgetOrderForm"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://widgetVendor.com/widgetOrderForm"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsd1="http://widgetVendor.com/types/widgetTypes"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">

<types>
  <schema targetNamespace="http://widgetVendor.com/types/widgetTypes"
           xmlns="http://www.w3.org/2001/XMLSchema"
           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <element name="keyElem" type="xsd:base64Binary"/>
  </schema>
</types>

<message name="widgetOrder">
  <part name="numOrdered" type="xsd:int"/>
</message>
<message name="widgetOrderBill">
  <part name="price" type="xsd:float"/>
</message>
<message name="badSize">
  <part name="numInventory" type="xsd:int"/>
</message>
<message name="widgetKey">
  <part name="keyVal" element="xsd1:keyElem"/>
</message>

<portType name="orderWidgets">
  <operation name="placeWidgetOrder">
    <input message="tns:widgetOrder" name="order"/>
    <output message="tns:widgetOrderBill" name="bill"/>
    <fault message="tns:badSize" name="sizeFault"/>
  </operation>
</portType>

<binding name="orderWidgetsBinding" type="tns:orderWidgets">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="placeWidgetOrder">
      <soap:operation soapAction="" style="document"/>
      <input name="order">
        <soap:body use="literal"/>
        <soap:header message="tns:widgetKey" part="keyVal"/>
      </input>
      <output name="bill">
        <soap:body use="literal"/>
        <soap:header message="tns:widgetKey" part="keyVal"/>
      </output>
      <fault name="sizeFault">
        <soap:body use="literal"/>
      </fault>
  </operation>
</binding>
...
</definitions>

例6.4「SOAP 1.1 SOAP ヘッダーを使用したバインド」 を変更して、ヘッダー値が入力メッセージと出力メッセージの一部になるようにします。