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

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

4.2.3 XMLデータを取り込んで使用する送信アプリケーション

 SOAPメッセージのSOAPエンベロープを作成するには、SAAJ-APIのcreateNameメソッドやaddBodyElementメソッドなどのAPIを使用してSOAPEnvelopeオブジェクトをアプリケーションロジックで組み立てる方法のほか、DOMやSAXなどのXMLデータ、および既存のファイルから読み込んだXMLデータをSOAPエンベロープの内容として取り込む方法があります。

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

 import org.w3c.dom.*;
 import javax.xml.parsers.*;
 import javax.xml.soap.*;
 import java.net.URL;
 import java.io.*;
 import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamSource;

 public class SampleMsgCL3importXML
 {
   //**(1)**
   private static Source createStreamSource() throws java.io.FileNotFoundException
   {
     FileInputStream _reqMsg = new FileInputStream("send.txt");
     StreamSource _ss = new StreamSource(_reqMsg);
     return _ss;
   }

   //**(2)**
   private static Source createDOMSource() throws ParserConfigurationException
   {
     DocumentBuilderFactory _dbf = DocumentBuilderFactory.newInstance();
     _dbf.setNamespaceAware(true);
     _dbf.setValidating(false);
     DocumentBuilder _db = _dbf.newDocumentBuilder();
     Document _doc = _db.newDocument();

     Element _elm1 = _doc.createElementNS( "urn:SampleMsg", "m:RequestBody" );
     Element _elm2 = _doc.createElement("Request");
     org.w3c.dom.Text _txt = _doc.createTextNode("request string...");
     _elm2.appendChild(_txt);
     _elm1.appendChild(_elm2);
     _doc.appendChild(_elm1);

     Document _envDoc = _db.newDocument();
     Element _envElm = _envDoc.createElementNS(
               SOAPConstants.URI_NS_SOAP_ENVELOPE, "soapenv:Envelope" );
     Element _bodyElm = _envDoc.createElementNS(
               SOAPConstants.URI_NS_SOAP_ENVELOPE, "soapenv:Body" );
     org.w3c.dom.Node _envNode = 
               _envDoc.importNode( _doc.getDocumentElement(), true );
     _bodyElm.appendChild(_envNode);
     _envElm.appendChild(_bodyElm);
     _envDoc.appendChild(_envElm);
     Element _envRootElm = _envDoc.getDocumentElement();

     DOMSource _ds = new DOMSource(_envRootElm.getOwnerDocument());
     return _ds;
   }

   public static void main( String[] args )
   {
     try{
       if( args.length < 1 ) usage();
       int _mode = 0;
       if( args[0].equals("DOM")) _mode = 1;
       else if( args[0].equals("Stream")) _mode = 2;
       else _mode = 3;
       if( _mode > 2 ) usage();

       String endPoint = new String("http://localhost/soap/services/Sample1");
//** SSLの場合 **
//**    String endPoint = new String("https://localhost/soap/services/Sample1");

       SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
       SOAPConnection conn = scf.createConnection();
       MessageFactory mf = MessageFactory.newInstance();
       SOAPMessage msg = mf.createMessage();
       SOAPPart part = msg.getSOAPPart();

       Source _source = null;
       switch(_mode) {
       case 1 :
          _source = createDOMSource();
          break;
       case 2 :
          _source = createStreamSource();
          break;
       }

       //**(3)**
       part.setContent(_source);

       msg.saveChanges();
       SOAPMessage reply = conn.call( msg, endPoint );

       SOAPPart _respPart = reply.getSOAPPart();
       //**(4)**
       _source = _respPart.getContent();
       if( _source instanceof StreamSource ){
         InputStream _is = ((StreamSource)_source).getInputStream();
         byte[] _ba = new byte[_is.available()];
         _is.read(_ba);
         FileOutputStream _replyMsg = new FileOutputStream("reply.txt");
         _replyMsg.write(_ba);
         _replyMsg.close();
       }
       conn.close();
     } 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();
     }
   }

   private static void usage()
   {
     System.out.println("usage:>java SampleMsgCL3 [DOM|Stream]");
     System.exit(1);
   }
 }

■XMLデータを使用したSOAPメッセージの組み立て

 サンプルプログラムSampleMsgCL3importXML.javaでは、DOMオブジェクトを使用する方法と、既存のXMLファイルから読み込んだデータを元にSOAPメッセージを組み立てる方法を用いています。

■XMLファイルから読み込んだデータを使用したSOAPメッセージの組み立て

 ファイルから読み込んだXMLデータなどのjava.io.InputStreamオブジェクトが入力元となるXMLデータを使用してSOAPメッセージを作成する場合はjavax.xml.transform.stream.StreamSourceオブジェクトを使用します。
 javax.xml.transform.stream.StreamSourceクラスは、javax.xml.transform.Sourceインタフェースを実装するクラスです。サンプルプログラムSampleMsgCL3importXML.javaでは、"send.txt"というファイルの内容を元にjavax.xml.transform.stream.StreamSourceオブジェクトを生成しています。−(1)

■DOMオブジェクトを使用したSOAPメッセージの組み立て

 DOM-APIで組み立てられたDOMオブジェクトを使用してSOAPメッセージを作成する場合はjavax.xml.transform.dom.DOMSourceオブジェクトを使用します。
 javax.xml.transform.dom.DOMSourceクラスはjavax.xml.transform.Sourceインタフェースを実装するクラスです。サンプルプログラムSampleMsgCL3importXML.javaでは、DOM-APIで以下に示すSOAPメッセージを組み立て、そのDOMオブジェクトからjavax.xml.transform.dom.DOMSourceオブジェクトを生成しています。−(2)

 <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">
       <Response>request string...</Response>
     </m:RequestBody>
   </soapenv:Body>
 </soapenv:Envelope>

■XMLデータのSOAPメッセージへの設定・取得

 ファイルから読み込んだXMLデータやDOMオブジェクトを使用したXMLオブジェクトを使用して生成されたjavax.xml.transform.SourceオブジェクトはSOAPPart.setContentメソッドを使用することでSOAPメッセージに設定できます。−(3)

 また同様に受信したSOAPメッセージを表すSOAPMessageオブジェクトからSOAPPart.getContentメソッドを使用して受信したデータをjavax.xml.transform.Sourceオブジェクトとして取得できます。−(4)


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

All Rights Reserved, Copyright(C) 富士通株式会社 2005