ヘッダーをスキップ

Oracle Application Server Web Services開発者ガイド
10g(10.1.3.1.0)

B31868-01
目次
目次
索引
索引

戻る 次へ

17 SOAPヘッダーの処理

この章では、SOAPヘッダーを処理する方法について説明します。

パラメータ・マッピングによるSOAPヘッダーの処理方法

WebServicesAssemblerツールを使用すると、WSDLファイルのwsdl:binding要素で定義されているSOAPヘッダー・ブロックを、生成されるサービス・エンドポイント・インタフェース(SEI)のメソッド・パラメータにマップできます。これにより、SOAPヘッダー・ブロックには、サービス・エンドポイント・インタフェースを実装するメソッド内から直接アクセスできるようになります。

例17-1に、SOAPヘッダーを明示的に定義する単純なWSDLを示します。

例17-1    SOAPヘッダーを明示的に定義する単純なWSDL

<definition xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://test.com" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
>
   <types/>
   <message name="HelloHeader">
      <part name="header" type="xs:string"/>
   </message>
   <message name="HelloMessage">
      <part name="body" type="xs:string"/>
   </message>
   message name="HelloMessageResponse"/>
   <portType name="HelloPortType">
      <operation name="sayHello">
         <input message="tns:HelloMessage"/>
         <output message="tns:HelloMessageResponse/>
         </operation>
      </portType>
      <binding name="HelloBinding" type="tns:HelloPortType">
         <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
         <operation name="sayHello">
            <input>
               <soap:body use="literal" namespace="http://test.com"/>
               <!--the SOAP header must be defined here -->
               <soap:header message=""tns:HelloHeader" part="header" use="literal"/>
         </input>
         <output>
            <soap:body use="literal" namespace="http://test.com"/>
         </output>
      </operation>
   </binding>
   <service name="HelloService">
      <port name="HelloPort" binding="tns:HelloBinding">
         <soap:address location="http://localhost:8888/hello-service/hello-service"/>
      </port>
   </service>
</definition>

WebServicesAssemblerツールは、パラメータにSOAPヘッダーをマップするためのブール型引数mapHeadersToParametersを提供します。この引数のデフォルトはtrueのため、SOAPヘッダーを抑止する場合を除いて明示的に指定する必要はありません。

AntタスクまたはWebServicesAssemblerツールの使用によるパラメータ・マッピングにより、サービス・エンドポイント・インタフェースを生成できます。次のAntタスクのサンプルでは、SOAPヘッダーを、hello-service Webサービスのパラメータにマップしています。

<oracle:topDownAssemble appName="hello-service"
                   wsdl="Hello.wsdl"
                   input="./classes"
                   output="build"
                   ear="dist/hello-service.ear"
                   packageName="oracle.demo "
                   mapHeadersToParameters="true"
                   >
                   <oracle:porttype className="oracle.demo.HelloImpl" />
</oracle:topDownAssemble>

次の例は、前述の例のWebServicesAssemblerコマンドライン・バージョンです。

java -jar wsa.jar -topDownAssemble 
                  -wsdl Hello.wsdl 
                  -output build 
                  -ear dist/hello-services.ear 
                  -mapHeadersToParameters true 
                  -packageName oracle.demo

このコマンドおよびAntタスクの説明:

パラメータにヘッダーをマップできるAntタスクとコマンド

次のWebServicesAssemblerコマンドおよびAntタスクを使用すると、mapHeaderstoParameters引数をコールできます。これらのコマンドの詳細は、第18章「WebServicesAssemblerの使用方法」を参照してください。

ハンドラを使用したSOAPヘッダーの処理方法

JAX-RPCハンドラを使用すると、明示的と暗黙的の両方のSOAPヘッダーを処理できます。明示的SOAPヘッダーとは、WSDLドキュメントに定義されているSOAPヘッダーのことです。例17-1に、SOAPヘッダーが定義されている単純なWSDLを示します。暗黙的SOAPヘッダーとは、必ずしも特定のWSDLドキュメントで定義されているとはかぎらないが、SOAPエンベロープに含まれているものです。

ハンドラでは、javax.xml.rpc.handler.Handlerインタフェースで定義されたメソッドを使用してSOAPヘッダーにアクセスできます。これらのメソッドは次のとおりです。

boolean handleRequest(MessageContext context);
boolean handleResponse(MessageContext context);
boolean handleFault(MessageContext context);

これらのメッセージの各context引数を使用して、SOAPエンベロープ内のSOAPヘッダーを表示できます。次に、SOAPリクエストのヘッダーを表示するハンドラ実装の例を示します。

boolean handleRequest(MessageContext context){
      javax.xml.rpc.handler.soap.SOAPMessageContext smc = 
(javax.xml.rpc.handler.soap.SOAPMessageContext)context;
      javax.xml.soap.SOAPHeader sh = smc.getSOAPMessage.getSOAPHeader();
      //the SOAPHeader will contain a list of SOAPHeaderElements (header blocks)
      Iterator it = sh.examineAllHeaderElements();
      //iterate through all the SOAP header elements and print their names
      while(it.hasNext()){
            javax.xml.soap.SOAPHeaderElement elem = (SOAPHeaderElement)it.next();
            System.out.println(elem.getElementName().getQualifiedName());
      }
      return true;
}

関連資料

  • Handlerインタフェースの詳細は、次のWebアドレスにあるJava API for XML-Based RPC(JAX-RPC 1.1)の仕様を参照してください。

    http://java.sun.com/webservices/jaxrpc/index.jsp

  • メッセージの直接処理の詳細は、次のWebアドレスにあるSOAP with Attachments API for Java (SAAJ)を参照してください。

    http://java.sun.com/webservices/saaj/index.jsp

 

ServiceLifecycleインタフェースを使用したSOAPヘッダーの処理方法

サービス・エンドポイントのライフ・サイクルは、javax.xml.rpc.server.ServiceLifecycleインタフェースを実装することで管理できます。このインタフェースには次のメソッドがあります。

void init(Object context);
void destroy();

ランタイム・システムは、initメソッドを起動し、contextオブジェクトを渡します。contextオブジェクトには、ServletEndpointContextオブジェクトが含まれています。このオブジェクトからSOAPMessageContextを抽出し、起動のたびにヘッダーを処理できます。

例17-2は、javax.xml.rpc.server.ServiceLifecycleインタフェースを使用してSOAPヘッダーにアクセスする方法を示しています。

例17-2    ServiceLifecycleを使用してSOAPヘッダーにアクセスする方法

public class HelloImpl implements HelloPortType,ServiceLifecycle{
      private Object m_context;

      public void sayHello(String body){
            javax.xml.rpc.server.ServletEndpointContext sec = 
(ServletEndpointContext)m_context;
            javax.xml.rpc.handler.soap.SOAPMessageContext mc = 
(SOAPMessageContext)sec.getMessageContext();
            javax.xml.soap.SOAPHeader sh = mc.getSOAPMessage().getSOAPHeader();
             // from here you can process all the header 
             // blocks in the SOAP header.
}

      //this will be called by the runtime system.
      public void init(Object context){
      m_context = context;
      }
      public void destroy(){
      }
}

このインタフェースを実装することで、明示的および暗黙的の両方のSOAPヘッダーを処理できます。ただし、暗黙的ヘッダーを処理する場合にとっての方が利便性は高くなります。

HTTPレスポンスおよびリクエストのヘッダーの取得方法

次の各項では、静的スタブ・クライアントおよびDynamic Invocation Interface(DII)クライアントがHTTPのレスポンスおよびリクエストからヘッダーを取得する方法を説明します。

スタブ・クライアントのServiceLifecycleインタフェースによるヘッダーの取得方法

J2SEおよびJ2EEの静的スタブ・クライアントは、oracle.webservices.ServerConstantsクラスのHTTP_SERVLET_REQUESTプロパティおよびHTTP_SERVLET_RESPONSEプロパティを使用して、HTTPメッセージのヘッダーにアクセスできます。サービス実装クラスでは、Webサービスのコール元がHTTPトランスポートを使用するときに、このプロパティを使用することでHTTPサーブレットのリクエストまたはレスポンスを取得できます。

これらのプロパティを使用するには、サービス実装ではjavax.xml.rpc.server.ServiceLifecyleを実装し、initメソッドに渡されたObjectを保存する必要があります。このオブジェクトはjavax.xml.rpc.server.ServletEndpointContextのインスタンスです。

サービス実装クラスのメソッドが起動されると、ServletEndpointContext.getMessageContextメソッドによりjavax.xml.rpc.handler.MessageContextが戻されます。MessageContext.getPropertyメソッドは、HTTP_SERVLET_REQUESTまたはHTTP_SERVLET_RESPONSEをプロパティ名として使用できます。

HTTP_SERVLET_REQUESTが要求されたプロパティである場合、戻されるオブジェクトは、javax.servlet.http.HttpServletRequestのインスタンスです。HTTP_SERVLET_RESPONSEが要求されたプロパティである場合、戻されるオブジェクトは、javax.servlet.http.HttpServletResponseのインスタンスです。

例17-3に、HTTPリクエスト・ヘッダーを取得してIPアドレスを取得する方法を示します。この例では、HelloImplクラスによりServiceLifecycleインタフェースが実装されています。この場合、initメソッドに渡されたcontextオブジェクトは、ServletEndpointContextオブジェクトにキャストされています。destroyメソッドにより、サービスのライフ・サイクルが破棄されています。getIPAddressメソッドの実装では、getMessageContextメソッドにより、ServletEndpointContextオブジェクトからメッセージ・コンテキストが引き出されます。getPropertyメソッドでは、HTTP_SERVLET_REQUESTプロパティを使用し、HttpServletRequestオブジェクトとしてリクエストを戻します。getRemoteAddrメソッドでは、IPアドレスが戻されます。

例17-3    HTTPヘッダーの取得

public class HelloImpl implements ServiceLifecycle  {
   ServletEndpointContext m_context;
   public void init(Object context) throws ServiceException {
       m_context = (ServletEndpointContext)context;
   }
 
   public void destroy() {
    }
 
   public String getIPAddress(){
      HttpServletRequest request = (HttpServletRequest)m_context. 
          getMessageContext().getProperty(ServerConstants.HTTP_SERVLET_REQUEST);
      return request.getRemoteAddr();
   }
 
}

DIIクライアントのOracleCallインタフェースによるヘッダーの取得方法

Dynamic Invocation Interface(DII)クライアントは、oracle.webservices.OracleCallインタフェースのメソッドを使用して、HTTPリクエストおよびレスポンスのヘッダーを取得できます。レスポンス・ヘッダーを取得するには、getResponseHeaders()メソッドを使用します。このメソッドはVectorを戻します。Vector内の要素が、SOAPレスポンス・ヘッダーです。

リクエスト・ヘッダーを取得するには、getHeaders()メソッドを使用します。このメソッドもVectorを戻し、その要素がSOAPレスポンス・ヘッダーです。通常、ヘッダーは、addHeaders()メソッドでVectorに追加されます。

例17-4は、レスポンス・ヘッダーを取得するためのDIIクライアント・コードです。

例17-4    DIIクライアント・コードでのレスポンス・ヘッダーの取得

...
OracleCall call = (OracleCall)port.getCall();
Vector headers = call.getResponseHeaders();
if (Vector != null) {
    for(int i = 0;i < headers.size();i++) {
        Element header = (Element) headers.get(i);
        // do something with the header Element
        ...
    }
}
...

WSIFサービスのDIIクライアントによるメッセージ・ヘッダーの取得方法

Web Services Invocation Framework(WSIF)のDIIクライアントがメッセージ・ヘッダーを取得する方法の詳細は、『Oracle Application Server Web Servicesアドバンスト開発者ガイド』のWSIFサービスのDIIクライアントによるメッセージ・ヘッダーの取得方法に関する項を参照してください。

制限事項

「SOAPヘッダーの処理」を参照してください。

追加情報

詳細は、次を参照してください。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引