Interstage Application Server SOAPサービス ユーザーズガイド |
目次 索引 |
第4章 Messaging方式のアプリケーションの実装 | > 4.2 送信アプリケーションの作成 |
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); } } |
サンプルプログラムSampleMsgCL3importXML.javaでは、DOMオブジェクトを使用する方法と、既存の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-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データやDOMオブジェクトを使用したXMLオブジェクトを使用して生成されたjavax.xml.transform.SourceオブジェクトはSOAPPart.setContentメソッドを使用することでSOAPメッセージに設定できます。−(3)
また同様に受信したSOAPメッセージを表すSOAPMessageオブジェクトからSOAPPart.getContentメソッドを使用して受信したデータをjavax.xml.transform.Sourceオブジェクトとして取得できます。−(4)
目次 索引 |