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

|
4.3.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/issoapx/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)
Copyright 2003 FUJITSU LIMITED