|
|
| |
WSDL ファイルを使用しない Web サービスの呼び出し
この付録では、WebLogic Web サービスを呼び出すときに WSDL ファイルを使用しない動的クライアント アプリケーションの例を示します。この例では特に、メッセージ スタイル Web サービスを呼び出して、データを WebLogic Server に送信します。
Web サービスの WSDL を使用しない動的クライアント アプリケーションは、すべてにおいて動的です。これは Web サービスのインタフェース、または戻り値およびパラメータの JavaBean インタフェースのいずれか、あるいは Web サービスを構成するメソッドの数およびシグネチャが不明でも Web サービスを呼び出すことができることによります。
この例では、Web サービスの呼び出しに URL http://www.myHost.com:7001/msg/sendMsg
を使用します。この例では Web サービスの WSDL を使用しない動的クライアント アプリケーションを示しているので、前述の URL は Web サービスの WSDL ではなく、Web サービス自体を表します。
例の後の手順では、このクライアントを作成するために実行する基本手順の一部として、例に関連する節について説明します。
import java.util.Properties;
import java.net.URL;
import javax.naming.Context;
import javax.naming.InitialContext;
import weblogic.soap.WebServiceProxy;
import weblogic.soap.SoapMethod;
import weblogic.soap.SoapType;
import weblogic.soap.codec.CodecFactory;
import weblogic.soap.codec.SoapEncodingCodec;
import weblogic.soap.codec.LiteralCodec;
public class ProducerClient{
public static void main( String[] arg ) throws Exception{
CodecFactory factory = CodecFactory.newInstance();
factory.register( new SoapEncodingCodec() );
factory.register( new LiteralCodec() );
WebServiceProxy proxy = WebServiceProxy.createService(
new URL( "http://www.myHost.com:7001/msg/sendMsg" ) );
proxy.setCodecFactory( factory );
proxy.setVerbose( true );
SoapType param = new SoapType( "message", String.class );
proxy.addMethod( "send", null, new SoapType[]{ param } );
SoapMethod method = proxy.getMethod( "send" );
String toSend = arg.length == 0 ? "No arg to send" : arg[0];
Object result = method.invoke( new Object[]{ toSend } );
}
}
データを WebLogic Server に送信するメッセージ スタイル WebLogic Web サービスの呼び出しに WSDL を使用しない動的 Java クライアントを作成するには、次の手順に従ってください。
この手順の詳細については、 Java クライアント JAR ファイルの Web サービス ホーム ページからのダウンロードを参照してください。
main
メソッドで、エンコーディング スタイルのファクトリを作成し、WebLogic Server でサポートされる 2 つのスタイル(SOAP エンコーディング スタイルおよび Apache のリテラル XML エンコーディング スタイル)を登録します。
CodecFactory factory = CodecFactory.newInstance();
factory.register( new SoapEncodingCodec() );
factory.register( new LiteralCodec() );
WebServiceProxy proxy = WebServiceProxy.createService(
new URL( "http://www.myHost.com:7001/msg/sendMsg" ) );
proxy.setCodecFactory( factory );
proxy.setVerbose( true );
send
メソッドを動的に取得します。
SoapType param = new SoapType( "message", String.class );
proxy.addMethod( "send", null, new SoapType[]{ param } );
SoapMethod method = proxy.getMethod( "send" );
send
メソッドを呼び出して、データを Web サービスに送信します。この例では、クライアント アプリケーションは単純に最初の引数を受け取って String
として送信します。ユーザーが特定の引数を指定しない場合、クライアント アプリケーションでは文字列 No arg to send
を送信します。
String toSend = arg.length == 0 ? "No arg to send" : arg[0];
Object result = method.invoke( new Object[]{ toSend } );
org.w3c.dom.Document
、org.w3c.dom.DocumentFragment
、または org.w3c.dom.Element
の各データ型をパラメータとして受け付ける send
メソッドの使い方を、以下のさらに複雑な例で示します。この例では、send
メソッドのこのような考え方に沿ってリテラル エンコーディングを設定する方法を示しています。
import java.util.Properties;
import java.net.URL;
import java.io.File;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import weblogic.apache.xml.serialize.OutputFormat;
import weblogic.apache.xml.serialize.XMLSerializer;
import weblogic.apache.xerces.dom.DocumentImpl;
import weblogic.soap.WebServiceProxy;
import weblogic.soap.SoapMethod;
import weblogic.soap.SoapType;
import weblogic.soap.codec.CodecFactory;
import weblogic.soap.codec.SoapEncodingCodec;
import weblogic.soap.codec.LiteralCodec;
public class ProducerClient{
public static void main(String[] args) throws Exception{
String url = "http://localhost:7001";
// 引数リストを解析する
if (args.length != 2) {
System.out.println("Usage: java examples.webservices.message.ProducerClient http://hostname:port ¥"message¥"");
return;
} else if (args.length == 2) {
url = args[0];
}
CodecFactory factory = CodecFactory.newInstance();
factory.register(new SoapEncodingCodec());
factory.register(new LiteralCodec());
URL newURL = new URL(url + "/msg/sendMsg");
WebServiceProxy proxy = WebServiceProxy.createService(newURL);
proxy.setCodecFactory(factory);
proxy.setVerbose(true);
SoapType param = new SoapType( "message", Document.class );
proxy.addMethod( "send", null, new SoapType[]{ param } );
SoapMethod method = proxy.getMethod("send");
// proxy を出力して、メソッド シグネチャが問題なさそうか確かめる
System.out.println("Proxy:"+proxy);
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
// ファクトリから DocumentBuilder のインスタンスを取得する
DocumentBuilder db = dbf.newDocumentBuilder();
// ドキュメントを解析する
Document w3cDoc = db.parse(new File("/test/fdr_nodtd.xml"));
//Class parserClass = Class.forName("org.jdom.adapters.XercesDOMAdapter");
//DOMAdapter da = (DOMAdapter)parserClass.newInstance();
//Document w3cDoc = da.getDocument(new File("/test/fdr_nodtd.xml"),false);
// XML を出力して、ドキュメントが正常に読み込まれたかどうか確かめる
OutputFormat of = new OutputFormat();
of.setEncoding("UTF-8");
of.setLineWidth(40);
of.setIndent(4);
XMLSerializer xs = new XMLSerializer(System.out,of);
xs.serialize(w3cDoc);
System.out.println("Before Invoke");
Object result = method.invoke( new Object[]{w3cDoc} );
System.out.println("Done");
}
}