Menu Close

7.2. SOAP 1.2 メッセージへのヘッダーの追加

概要

SOAP メッセージヘッダーは、soap12:header 要素を SOAP 1.2 メッセージに追加して定義されます。soap12:header 要素は、バインディングの inputoutput、および fault 要素のオプションの子です。SOAP ヘッダーは親メッセージの部分になります。SOAP ヘッダーは、メッセージとメッセージの部分を指定して定義されます。各 SOAP ヘッダーに含めることができるメッセージ部分は 1 つだけですが、ヘッダーは必要な数だけ挿入できます。

構文

SOAP ヘッダーを定義する構文は 例7.3「SOAP ヘッダー構文」 にあります。

例7.3 SOAP ヘッダー構文

<binding name="headwig">
  <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="weave">
      <soap12:operation soapAction="" style="documment"/>
      <input name="grain">
        <soap12:body ... />
        <soap12:header message="QName" part="partName"
                       use="literal|encoded"
                        encodingStyle="encodingURI"
                        namespace="namespaceURI" />
      </input>
...
</binding>

soap12:header 要素の属性は 表7.1「soap12:header 属性」 で説明されています。

表7.1 soap12:header 属性

属性説明

message

ヘッダーに挿入される部分の取得元となるメッセージの修飾名を指定する必須属性です。

part

SOAP ヘッダーに挿入されるメッセージ部分の名前を指定する必須属性です。

use

メッセージ部分がエンコーディングルールを使用してエンコードされるかどうかを指定します。encoded に設定すると、メッセージ部分は、encodingStyle 属性の値で指定されたエンコーディングルールを使用してエンコードされます。literal に設定すると、メッセージ部分は参照されるスキーマ型によって定義されます。

encodingStyle

メッセージの構築に使用されるエンコーディングルールを指定します。

namespace

use="encoded" でシリアライズされたヘッダー要素に割り当てる namespace を定義します。

ボディーとヘッダー間のメッセージの分割

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

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

注記

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

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

例7.4 SOAP 1.2 バインディングと SOAP ヘッダー

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="widgetOrderForm.wsdl"
    targetNamespace="http://widgetVendor.com/widgetOrderForm"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
    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">
  <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="placeWidgetOrder">
      <soap12:operation soapAction="" style="document"/>
      <input name="order">
        <soap12:body use="literal"/>
        <soap12:header message="tns:widgetKey" part="keyVal"/>
      </input>
      <output name="bill">
        <soap12:body use="literal"/>
        <soap12:header message="tns:widgetKey" part="keyVal"/>
      </output>
      <fault name="sizeFault">
        <soap12:body use="literal"/>
      </fault>
  </operation>
</binding>
...
</definitions>

例7.5「SOAP ヘッダーのある orderWidgets の SOAP 1.2 バインディング」 に示されるように、ヘッダー値が入力および出力メッセージの一部であるように、例7.4「SOAP 1.2 バインディングと SOAP ヘッダー」 を変更することができます。この場合、keyVal は入出力メッセージの一部です。soap12:body 要素では、parts 属性によって、keyVal がボディーに挿入されてはならないことが指定されます。ただし、ヘッダーに挿入されます。

例7.5 SOAP ヘッダーのある orderWidgets の SOAP 1.2 バインディング

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="widgetOrderForm.wsdl"
    targetNamespace="http://widgetVendor.com/widgetOrderForm"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
    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"/>
  <part name="keyVal" element="xsd1:keyElem"/>
</message>
<message name="widgetOrderBill">
  <part name="price" type="xsd:float"/>
  <part name="keyVal" element="xsd1:keyElem"/>
</message>
<message name="badSize">
  <part name="numInventory" type="xsd:int"/>
</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">
  <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="placeWidgetOrder">
      <soap12:operation soapAction="" style="document"/>
      <input name="order">
        <soap12:body use="literal" parts="numOrdered"/>
        <soap12:header message="tns:widgetOrder" part="keyVal"/>
      </input>
      <output name="bill">
        <soap12:body use="literal" parts="bill"/>
        <soap12:header message="tns:widgetOrderBill" part="keyVal"/>
      </output>
      <fault name="sizeFault">
        <soap12:body use="literal"/>
      </fault>
  </operation>
</binding>
...
</definitions>