Interstage Application Server SOAPサービス ユーザーズガイド
目次 索引 前ページ次ページ

第4章 Messaging方式のアプリケーションの実装> 4.3 送信アプリケーションの作成

4.3.1 基本的な送信アプリケーション

 以下のサンプルプログラムSampleMsgCL1.javaの例を用いて処理を説明します。

 import javax.xml.soap.*;
 import java.net.URL;
 import java.io.*;
 import java.util.*;

 public class SampleMsgCL1
 {
  public static void main( String[] args )  // (1)
  {
   try{
    //**(2)**
    String endPoint = new String("http://localhost/issoapx/services/Sample1");

    //**(3)**
    SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
    SOAPConnection conn = scf.createConnection();

    //**(4)**
    MessageFactory mf = MessageFactory.newInstance();
    SOAPMessage msg = mf.createMessage();

    //**(5)**
    SOAPPart part = msg.getSOAPPart();
    SOAPEnvelope env = part.getEnvelope();
    env.getHeader().detachNode();
    SOAPBody body = env.getBody();
    SOAPBodyElement elm = body.addBodyElement(
        env.createName( "RequestBody", "m", "urn:SampleMsg" ));
    elm.addChildElement( env.createName("Request")).
        addTextNode("request string...");
    elm.addNamespaceDeclaration( "m", "urn:SampleMsg" );
    msg.saveChanges();

    FileOutputStream requestFile = new FileOutputStream("request.msg");
    msg.writeTo(requestFile);
    requestFile.close();

    //**(6)**
    SOAPMessage reply = conn.call( msg, endPoint );

    //**(7)**
    FileOutputStream replyFile = new FileOutputStream("reply.msg");
    reply.writeTo(replyFile);
    replyFile.close();

    //**(8)**
    part = reply.getSOAPPart();
    env = part.getEnvelope();
    body = env.getBody();
    if( body.hasFault()){
     System.out.println("Body is SOAPFault.");
     SOAPFault fault = body.getFault();
     String faultActor = fault.getFaultActor();
     String faultCode = fault.getFaultCode();
     String faultString = fault.getFaultString();
     System.out.println("faultActor :"+faultActor);
     System.out.println("faultCode :"+faultCode);
     System.out.println("faultString:"+faultString);
     Iterator it = fault.getChildElements();
     while(it.hasNext()){
      SOAPElement detailElm = (SOAPElement)it.next();
      System.out.println("Detail:"+detailElm);
     }
    }
    else{
     System.out.println("Body is not SOAPFault.");
     Iterator it = body.getChildElements();
     while(it.hasNext()){
      SOAPElement bodyElm = (SOAPElement)it.next();
      System.out.println("Element:"+bodyElm);
     }
    }

    //**(9)**
    conn.close();

    //**(10)**
   } catch( SOAPException e ) {
    System.out.println("SOAPException raised.");
    System.out.println(" Message:"+e.getMessage());
    System.out.println(" Cause :"+e.getCause());
    e.printStackTrace();
   } catch( Throwable t ) {
    t.printStackTrace();
   }
  }
 }


■任意のクラス、任意のメソッドで実装可能

 受信アプリケーションと異なり、送信アプリケーションでは、実装や継承が必要なクラスはありません。任意のクラスの、任意のメソッドで送信処理を行うことができます。−(1)

■接続先およびConnectionの取得

 SOAPメッセージの送信先への仮想コネクションを取得します。
 送信先のURLを用意し、−(2)
 SOAPConnectionFactory オブジェクトからSOAPConnectionオブジェクトを取得します。−(3)

 送達保証機能を使用する場合は、ProviderConnectionFactoryオブジェクトからProviderConnectionオブジェクトを取得します。詳細は、“送達保証機能の実装”を参照してください。

■送信するSOAPMessageオブジェクトの取得

 送信するSOAPメッセージを表すSOAPMessageオブジェクトを取得します。
 SOAPMessageオブジェクトはMessageFactoryオブジェクトから取得します。−(4)

 ProviderConnectionは、送達保証機能を使用する場合に使用します。詳細は“送達保証機能の実装”を参照してください。

■送信するSOAPメッセージの内容設定

 SAAJ-APIを使用して、送信するSOAPメッセージを作成します。−(5)
 この例では、直接SOAPEnvelopeの内容をプログラム上で組み立てる方法を使用しています。ほかに、既存のXMLデータを使用する方法もあります。詳細は“XMLデータを取り込んで使用する送信アプリケーション”を参照してください。

 クライアントシステムでは、SOAPボディの子要素のネームスペース名(例ではurn:SampleMsg)がWebサービス識別名と一致するWebサービス情報が適用されます。詳細については“Webサービス情報の管理”の“Webサービス識別名とURL”を参照してください。

 サンプルプログラムでは、以下のSOAPメッセージを作成しています(ただし、わかりやすくするために要素の間に改行と空白を追加して記述しています。)。

 <soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/
          xmlns:xsd=http://www.w3.org/2001/XMLSchema
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
   <m:RequestBody xmlns:m="urn:SampleMsg">
    <Request>request string...</Request>
   </m:RequestBody>
  </soapenv:Body>
 </soapenv:Envelope>

■SOAPメッセージの送信

 SOAPConnection.callメソッドで送信します。送信先のWebサービスがRequestResponse方式で返信メッセージがある場合は、Webサービスから返信されたSOAPメッセージが返されます。OneWay方式など返信メッセージがない場合は、nullが返ります。−(6)

 送達保証機能を使用する場合は、ProviderConnectionクラスのsendメソッドで送信します。詳細は“送達保証機能の実装”を参照してください。

■返信されたSOAPメッセージの処理

 RequestResponse方式の場合、Webサービスから返信されたSOAPメッセージをSAAJ-APIを使用して解析処理を行います。SOAPメッセージの解析については“SAAJ-APIによるSOAPメッセージの処理”を参照してください。

 この例では、受信したSOAPメッセージを"reply.msg"というファイルに出力しています。−(7)

■Faultの判定

 SOAPメッセージを送信するとサーバシステムからFaultが返される場合があります。FaultはSOAPボディに設定されてクライアントシステムへ返されます。まずSOAPボディにFaultが設定されているかを判定し、Faultが返ってきた場合はエラー処理を行います。Fault情報の取り出しはSAAJ-APIを使用します。サンプルではFaultの詳細情報を標準出力に出力しています。−(8)

■Connectionの後処理

 不要になった仮想コネクションを閉じます。−(9)

■例外の処理

 SAAJ-APIを使用したSOAPメッセージの作成・解析処理において例外SOAPExceptionが発生する場合があります。SOAPExceptionはSOAPメッセージ送信時にメッセージの矛盾をランタイムが検出した場合やコネクション接続に失敗した場合などにランタイムから返されます。SAAJ-APIを使用するアプリケーションはSOAPExceptionをcatchする必要があります。サンプルでは例外情報とスタックトレースを標準出力に出力しています。−(10)


目次 索引 前ページ次ページ

Copyright 2003 FUJITSU LIMITED