Oracle Application Server Web Services開発者ガイド 10g(10.1.3.1.0) B31868-01 |
|
この章では、J2SEプラットフォーム向けのWebサービス・クライアントの開発に関する情報を提供します。この章の内容は、次のとおりです。
J2SEクライアントは、J2EEクライアントとは異なり、サービスのルックアップ、ならびにWebサービスにアクセスするクラスのインスタンスの作成およびメンテナンスなどの、基礎となる作業を行います。開発者は、コンテナに依存できないため、独自のサービスの作成および管理、ならびにWebサービスのアクセスに必要なすべてのランタイム環境の可用性の確保を自身で行う必要があります。
次の各項では、静的スタブ・クライアントおよびDynamic Invocation Interface(DII)クライアントについて説明します。
WebServicesAssemblerコマンドのgenProxy
は、指定されたWSDLドキュメントから静的スタブを生成します。生成されるスタブは、javax.xml.rpc.Stub
インタフェースおよびサービス・エンドポイント・インタフェースを実装したものです。また、生成されるスタブは、HTTPトランスポートおよびSOAPプロトコルに明示的にバインドされます。生成されるスタブをインスタンス化し、そのメソッドを直接起動することで、リクエストを関連するWebサービスに送信できます。
さらに、WebServicesAssemblerは、クライアントが静的スタブによってWebサービスと対話できるようにするクライアント・ユーティリティ・クラスを生成します。このユーティリティ・クライアント・クラスの名前は<WSDL_port_name
>Client.java
です。このクラスは、スタブのインスタンスの作成に必要なすべてのステップを処理します。ユーティリティ・クライアントは、インスタンス化して、リモート・サービスの操作を起動するために使用できます。
JAX-RPC Dynamic Invocation Interfaceを使用すると、サービス名またはリモート・メソッドのシグネチャを実行時の前に確認できない場合でも、リモートWebサービス操作を起動できます。
DIIは、OC4Jでのjavax.xml.rpc.Call
インタフェースの実装によってサポートされています。javax.xml.rpc.Service
クラスは、オーバーロードされたService.createCall()
メソッドを使用することで、Call
インスタンスのファクトリとして動作します。Call
インタフェースの作成後、このインタフェースに含まれるゲッターおよびセッターを使用して、ポート・タイプ、操作名、サービス・エンドポイント・アドレス、およびリモート・メソッドの実行に必要なその他の属性を構成します。
この項の内容は、次のとおりです。
開始する前に、次のファイルと情報を用意してください。
WebServicesAssemblerで静的スタブを使用して、J2SE Webサービス・クライアントを作成できます。静的スタブを作成する手順は、次のとおりです。
genProxy
コマンドに入力します。次のコマンドは、クライアント・プロキシを生成し、build/src/client
に格納します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービスでの操作を起動します。コマンドライン:
java -jar wsa.jar -genProxy -output build/src/client/ -wsdl http://localhost:8888/hello/HelloService?WSDL -packageName oracle.demo.hello
Antタスク:
<oracle:genProxy wsdl="http://localhost:8888/hello/HelloService?WSDL" output="build/src/client" packageName="oracle.demo.hello"/>
このコマンドおよびAntタスクの説明:
genProxy
: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
packageName
: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。
genProxy
の必須およびオプションの引数の詳細は、「genProxy」を参照してください。
genProxy
によって作成されたクライアント・ユーティリティ・クラス・ファイルを、アプリケーション・クライアントとして使用するか、またはテンプレートとして使用して独自のクライアント・コードを記述します。クライアント・ユーティリティ・クラス・ファイルは、genProxy
によって作成されるいくつかのファイルの1つです。 また、クライアント・ユーティリティ・クラス・ファイルは、エンドポイントをテストするためにも使用できます。クライアント・ユーティリティ・クラス・ファイルの作成例は、例15-2「HelloInterfacePortClient.javaのリスト」を参照してください。このファイルの詳細は、「Webサービス・クライアント・アプリケーションの記述」を参照してください。
クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jar
を含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jar
およびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。
例15-1は、クライアント生成に使用するHelloService.wsdl
のリストの一部です。このWSDLから生成されるファイルの1つが、例15-2のクライアント・ユーティリティ・クラス・ファイルです。
リスト断片には、クライアント・ユーティリティ・クラス・ファイルの生成に使用される、WSDLファイル内のいくつかのエントリが記載されています。次に例を示します。
<port name>
属性の値。これを使用して、クライアント・ユーティリティ・クラス・ファイルの名前HelloInterfacePortClient.java
が導出されます。
<portType>
要素の下にある操作名sayHello
。これは、クライアント・ユーティリティ・クラス・ファイルのメソッドになります。
sayHello
リクエストを定義するcomplexType
。これによって、sayHello
のパラメータおよびデータ型が定義されます。
<complexType name="sayHello"> <sequence> <element name="name" nillable="true" type="string"/> </sequence> </complexType>
これらの各要素は、HelloService.wsdl
のリスト断片では太字で示されています。
<definitions ... > <types> <schema targetNamespace="http://hello.demo.oracle/" ... xmlns="http://www.w3.org/2001/XMLSchema" ... <complexType name="sayHello"> <sequence> <element name="name" nillable="true" type="string"/> </sequence> </complexType> <complexType name="sayHelloResponse"> <sequence> <element name="result" nillable="true" type="string"/> </sequence> </complexType> <element name="sayHelloElement" type="tns:sayHello"/> <element name="sayHelloResponseElement" type="tns:sayHelloResponse"/> </schema> </types> <message name="HelloInterface_sayHelloResponse"> <part name="parameters" element="tns:sayHelloResponseElement"/> </message> <message name="HelloInterface_sayHello"> <part name="parameters" element="tns:sayHelloElement"/> </message> <portType name="HelloInterface"> <operation name="sayHello"> <input message="tns:HelloInterface_sayHello"/> <output message="tns:HelloInterface_sayHelloResponse"/> </operation> </portType> <binding name="HelloInterfacePortBinding" type="tns:HelloInterface"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="sayHello"> <soap:operation soapAction="http://hello.demo.oracle/:sayHello"/> <input> <soap:body use="literal" parts="parameters"/> </input> <output> <soap:body use="literal" parts="parameters"/> </output> </operation> </binding> <service name="HelloService"> <port name="HelloInterfacePort" binding="tns:HelloInterfacePortBinding"> <soap:address location="HelloService"/> </port> </service> </definitions>
この項の内容は、次のとおりです。
genProxy
コマンドにより、Webサービス・メソッドの起動に使用できるクライアント・ユーティリティ・クラス・ファイルが生成されます。このファイルを、アプリケーション・クライアントとして使用するか、またはテンプレートとして使用して独自のアプリケーション・クライアント・コードを記述できます。
genProxy
コマンドは、クライアント・ユーティリティ・クラス・ファイル名を導出する際、ポート名に接尾辞Client
を追加します。たとえば、ポート名がHelloInterfacePort
の場合は、genProxy
により、ファイルHelloInterfacePortClient.java
が生成されます。
関連項目
|
クライアント・ユーティリティ・クラスは、Webサービス実装のプロキシとしての役割を持ちます。クライアント・サイド・プロキシ・コードにより、SOAPリクエストの構成、パラメータのマーシャリングおよびアンマーシャリングが実行されます。プロキシ・クラスを使用すると、WebサービスへのアクセスやWebサービスのレスポンス処理に関する、SOAPリクエストの作成作業およびデータのマーシャリング作業が軽減されます。
クライアント・ユーティリティ・クラス・ファイルの最も重要な部分は、javax.xml.rpc.Service
オブジェクトを作成し、サービスで使用可能な操作を取得するファクトリ・コードです。Service
オブジェクトは、生成されるスタブ・クラスのインスタンスとして動作します。
クライアント・ユーティリティ・クラス・ファイルの次のコード行に注目してください。
public HelloInterfaceClient() throws Exception { ServiceFactory factory = ServiceFactory.newInstance(); _port = ((HelloService)factory.loadService (HelloService.class)).getHelloInterfacePort(); }
独自のアプリケーション・クライアントを記述する場合は、このコードを追加して、サービス・ファクトリを作成し、ポートの実装を取得する必要があります。
次の手順は、このコードの説明です。
javax.xml.rpc.ServiceFactory
の新しいインスタンスを作成するか、または既存のインスタンスを使用します。
ServiceFactory factory = ServiceFactory.newInstance();
loadService
メソッドを使用して、特定のサービス・エンドポイント・インタフェースに対してサービスをロードします。これにより、Service
型のオブジェクトが戻されます。さらに、このオブジェクトにより、リクエストしたサービス・エンドポイント・インタフェースが実装されます。
(HelloService)factory.loadService(HelloService.class)
この例では、戻されたService
が、サービス・エンドポイント・インタフェースHelloService
にキャストされています。
get
...()
メソッドを使用して、必要なポートを取得します。省略記号("...")は、WSDLのport name
要素の値を表します。
HelloService.getHelloInterfacePort();
この例では、メソッド名はgetHelloInterfacePort()
です。この名前の中のHelloInterfacePort
は、WSDL内のport name
の値です。メソッドにより、HelloInterfacePort
のJava実装が戻されます。
例15-2は、クライアント・ユーティリティ・クラス・ファイルHelloInterfacePortClient.java
を示します。これは、例15-1のHelloService.wsdl
からgenProxy
コマンドで生成されたものです。
Service
オブジェクトを作成し、サービスで使用可能な操作を取得するコード行は、太字で示されています。生成されたコードを使用して、SESSION_MAINTAIN_PROPERTY
システム・プロパティを設定し、Webサービスがステートフルであることをクライアントに警告できることに注意してください。クライアントがサーバー・サイドのステートフルWebサービスと連携して動作するとき、セッションは維持されます。セッションを維持することで、サービスに対する以降のリクエストが高速になります。
import oracle.webservices.transport.ClientTransport; import oracle.webservices.OracleStub; import javax.xml.rpc.ServiceFactory; import javax.xml.rpc.Stub; public class HelloInterfacePortClient { private HelloInterface _port; public HelloInterfacePortClient() throws Exception { ServiceFactory factory = ServiceFactory.newInstance(); _port =((HelloService)factory.loadService( HelloService.class)).getHelloInterfacePort(); } /** * @param args */ public static void main(String[] args) { try { HelloInterfacePortClient myPort = new HelloInterfacePortClient(); System.out.println("calling " + myPort.getEndpoint()); // Add your own code here } catch (Exception ex) { ex.printStackTrace(); } } /** * delegate all operations to the underlying implementation class. */ // sayHello public String sayHello(String name) throws java.rmi.RemoteException { return _port.sayHello(name); } /** * used to access the JAX-RPC level APIs * returns the interface of the port instance */ public oracle.demo.hello.HelloInterface getPort() { return _port; } public String getEndpoint() { return (String) ((Stub) _port)._getProperty(Stub.ENDPOINT_ADDRESS_PROPERTY); } public void setEndpoint(String endpoint) { ((Stub) _port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endpoint); } public String getPassword() { return (String) ((Stub) _port)._getProperty(Stub.PASSWORD_PROPERTY); } public void setPassword(String password) { ((Stub) _port)._setProperty(Stub.PASSWORD_PROPERTY, password); } public String getUsername() { return (String) ((Stub) _port)._getProperty(Stub.USERNAME_PROPERTY); } public void setUsername(String username) { ((Stub) _port)._setProperty(Stub.USERNAME_PROPERTY, username); } public void setMaintainSession(boolean maintainSession) { ((Stub) _port)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new Boolean(maintainSession)); } public boolean getMaintainSession() { return ((Boolean) ((Stub) _port)._getProperty(Stub.SESSION_MAINTAIN_PROPERTY)).booleanValue(); } /** * returns the transport context */ public ClientTransport getClientTransport() { return ((OracleStub) _port).getClientTransport(); } }
プロトコルがHTTP 1.1の場合、OracleAS Web Servicesでは、メッセージのチャンク転送エンコーディングが可能です。チャンク・データ転送は、J2SEスタブ、J2EEスタブおよびDII Webサービス・クライアントから起動できます。
デフォルトでは、Oracle Application Server Web Servicesでアセンブルされたクライアントは、UTF-8の文字でエンコードされたSOAPエンベロープを持つリクエスト・メッセージを送信します。この動作をオーバーライドする場合は、次のOracle固有のプロパティを設定します。
oracle.webservices.ClientConstants.CHARACTER_SET_ENCODING
このプロパティは、J2SEクライアントまたはJ2EEクライアントの文字コードを設定するために使用します。
クライアント・スタブは、HTTPリクエストで使用されるCookieの設定に使用できます。Cookie
クラスはHTTP Cookieを表し、Oracle Applications Server 10gのHTTPClient
パッケージにあります。Cookie
に次のコンストラクタがあります。
Cookie (java.lang.String
name
, java.lang.String
value
, java.lang.String
domain
,
java.lang.String
path
, java.util.Date
expires
, boolean
secure
)
expires
以外のすべてのパラメータが、Cookie
コンストラクタの必須パラメータです。
Cookieに対して指定するドメインは、次のいずれかである必要があります。
次に説明するのは、HTTPリクエストでCookieを設定する方法の一般的な手順です。
java.util.Map
オブジェクトを作成して、Cookieを組み込みます。
HTTPClient
パッケージに付属するCookie
クラスを使用して、1つ以上のCookieを作成します。
Map
オブジェクトにロードします。
oracle.webservices.ClientConstants.COOKIE_MAP
を設定します。 プロパティの値は、HTTPClient.Cookie
型のアイテムおよびキーが含まれるjava.util.Map
オブジェクトです。
javax.xml.rpc.session.SESSION_MAINTAIN_PROPERTY
ランタイム・プロパティ・セットをtrue
に設定します。 このプロパティは、Webサービスがステートフルであることをクライアントに警告しています。このプロパティをtrue
以外に設定すると、Cookieが無視されます。
例15-3は、2つのCookieの値を設定するスタブ・コードを示しています。cookieMap
変数は、java.util.Map
型として宣言され、その値をHashMap
から取得します。Cookie
コンストラクタは、cookie
およびcookie2
の2つのCookieの定義に使用されます。各cookieMap.put
行で、CookieがHashMapに追加されます。ClientConstants.COOKIE_MAP
がcookieMap
に設定されており、また、Stub.SESSION_MAINTAIN_PROPERTY
が指定されてtrue
に設定されています。
import HTTPClient.Cookie; Map cookieMap = new HashMap(); Cookie cookie = new Cookie("name", "value", ".oracle.com", "/", null, false); Cookie cookie2 = new Cookie("name2", "value2", ".oracle.com", "/", null, false); cookieMap.put(cookie, cookie); cookieMap.put(cookie2, cookie2); ((Stub) port)._setProperty(ClientConstants.COOKIE_MAP, cookieMap); ((Stub) port)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE); ...
Dynamic Invocation Interface(DII)を使用してWebサービスを起動するには、いくつかのステップが必要です。各ステップでは、通常いくつかの選択が必要です。この項の終わりにある各例に、各ステップで行われた選択が示されます。
DIIを使用してWebサービスを起動する方法は、次のような全般的なステップで構成されます。
コール・オブジェクトは、WSDLの有無を問わず作成できます。WSDLがないか、コールの動的作成にWSDLを使用しない場合は、「基本コール」の手順に従います。コールを構成するためのWSDLがある場合は、「構成コール」の手順に従います。
基本コールでは、WSDLがなくても、コール・オブジェクトが動的に作成されます。基本コールの構成方法の詳細は、次の手順を参照してください。
SOAPElement
を使用してもJavaバインディングを使用しても行えます。
SOAPElement
を使用するケース。document-literalの起動を使用する場合は、通常、メッセージ用にSOAPElement
を構成し、invoke()
メソッドに渡します。この起動では、OracleCall
からパブリックのOracle固有APIが使用されます。このケースの例は、次を参照してください。
invoke()
メソッドに指定し、予期する戻り型に戻りオブジェクトをキャストします。このケースの例は、次を参照してください。
構成コールの場合、コール・オブジェクトはWSDLから構成されます。構成コールの構成方法の詳細は、次の手順を参照してください。
SOAPElement
は作成しないケース。このようなケースでは、パラメータ名をラッパーのQName
にする必要があります。このケースの例は、次を参照してください。
SOAPElement
を使用してもJavaバインディングを使用しても行えます。
SOAPElement
を使用するケース。document-literalの起動を使用する場合は、通常、メッセージ用にSOAPElement
を構成し、invoke()
メソッドに渡します。この起動では、OracleCall
からパブリックのOracle固有APIが使用されます。このケースの例は、次を参照してください。
invoke()
メソッドに指定し、予期する戻り型に戻りオブジェクトをキャストします。このケースの例は、次を参照してください。
この項では、基本コールまたは構成コールを使用してWebサービスを起動する様々なクライアントの例を示します。
次のコードSnippetは、後続のコード例で使用されるimport
文です。
import javax.xml.rpc.ServiceFactory; import javax.xml.rpc.Service; import javax.xml.rpc.Call; import javax.xml.rpc.ParameterMode; import javax.xml.namespace.QName; import javax.xml.soap.SOAPFactory; import javax.xml.soap.SOAPElement; import java.net.URL; import oracle.webservices.OracleCall; import oracle.xml.parser.v2.XMLElement;例15-4 パラメータ登録とJavaバインディングのある基本コール
// (1) Creation of call object without WSDL. String endpoint = "http://localhost:8888/echo/DiiDocEchoService"; ServiceFactory sf = ServiceFactory.newInstance(); Service service = sf.createService(new QName("http://echo.demo.oracle/", "tns")); Call call = service.createCall(); // (2) Configuration of call and registration of parameters. call.setTargetEndpointAddress(endpoint); call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true)); call.setProperty(Call.SOAPACTION_URI_PROPERTY, ""); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/"); call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc"); QName QNAME_TYPE_STRING = new QName("http://www.w3.org/2001/XMLSchema", "string"); call.addParameter("s", QNAME_TYPE_STRING, ParameterMode.IN); call.setReturnType(QNAME_TYPE_STRING); // (3) Invocation. System.out.println("Response is " + call.invoke(new Object[]{"hello"}));例15-5 Javaバインディングあり、パラメータ登録なしの構成コール
/// (1) Creation of call object using WSDL. String namespace = "http://www.xmethods.net/sd/CurrencyExchangeService.wsdl"; URL wsdl=new URL(namespace); ServiceFactory factory = ServiceFactory.newInstance(); QName serviceName = new QName(namespace, "CurrencyExchangeService"); Service service = factory.createService(wsdl, serviceName); QName portName = new QName(namespace, "CurrencyExchangePort"); Call call = service.createCall(portName); // (2) Registration of parameters. // -> taken from the WSDL // (3) Configuration of operation and invocation. QName operationName = new QName("urn:xmethods-CurrencyExchange", "getRate"); call.setOperationName(operationName); Float rate = (Float) call.invoke(new Object[]{"usa", "canada"}); System.out.println("getRate: " + rate);例15-6 ラッパー・パラメータ登録とJavaバインディングのある構成コール
// (1) Creation of call object using WSDL. String namespace = "http://server.hello/jaxws"; ServiceFactory factory = ServiceFactory.newInstance(); QName serviceName = new QName(namespace, "HelloImplService"); URL wsdl=new URL(namespace+"?WSDL"); Service service = factory.createService(wsdl, serviceName); QName portName = new QName(namespace, "HelloImpl"); Call call = service.createCall(portName); // (2) Registration of SayHello and SayHelloResponse wrapper classes // These must be available in the classpath. String TYPE_NAMESPACE_VALUE = "http://server.hello/jaxws"; QName reqQname = new QName(TYPE_NAMESPACE_VALUE,"sayHelloElement"); QName respQName = new QName(TYPE_NAMESPACE_VALUE,"sayHelloResponseElement"); call.addParameter("name", reqQname, SayHello.class, ParameterMode.IN ); call.setReturnType(respQName, SayHelloResponse.class ); // (3) Invocation SayHello input = new SayHello("Duke"); Object[] params = new Object[] { input }; SayHelloResponse result = (SayHelloResponse) call.invoke( params ); String response = result.getResult();例15-7 SOAPElementあり、パラメータ登録なしの基本コール
// (1) Creation of call object without WSDL ServiceFactory sf = ServiceFactory.newInstance(); Service service = sf.createService(new QName("http://echo.demo.oracle/", "tns")); Call call = service.createCall(); call.setTargetEndpointAddress("http://localhost:8888/echo/DiiDocEchoService"); // (2) No registration of parameters // (3a) Direct creation of payload as SOAPElement SOAPFactory soapfactory = SOAPFactory.newInstance(); SOAPElement m1 = soapfactory.createElement("echoStringElement", "tns", "http://echo.demo.oracle/"); SOAPElement m2 = soapfactory.createElement("s", "tns", "http://echo.demo.oracle/"); m2.addTextNode("Bob"); m1.addChildElement(m2); System.out.println("Request is: "); ((XMLElement) m1).print(System.out); // (3b) Invocation SOAPElement resp = (SOAPElement) ((OracleCall) call).invoke(m1); System.out.println("Response is: "); ((XMLElement) resp).print(System.out);例15-8 WSDL、複合型戻り値/パラメータ登録およびJavaバインディングのある構成コール
// (0) Preparing a complex argument value Integer req_I = new Integer( Integer.MAX_VALUE ); String req_s = "testDocLitBindingAnonymAll & <body>"; Integer req_inner_I = new Integer( Integer.MIN_VALUE ); String req_inner_s = "<inner> & <body>"; int[] req_inner_i = {0,Integer.MAX_VALUE, Integer.MIN_VALUE}; InnerSequence req_inner = new InnerSequence(); req_inner.setVarInteger( req_inner_I ); req_inner.setVarString ( req_inner_s ); req_inner.setVarInt ( req_inner_i ); EchoAnonymAllElement req = new EchoAnonymAllElement(); req.setVarInteger ( req_I ); req.setVarString ( req_s ); req.setInnerSequence( req_inner); // (1) Creation of call object using the WSDL String TARGET_NS = "http://soapinterop.org/DocLitBinding"; String TYPE_NS = "http://soapinterop.org/xsd"; String XSD_NS = "http://www.w3.org/2001/XMLSchema"; QName SERVICE_NAME = new QName( TARGET_NS, "DocLitBindingService" ); QName PORT_NAME = new QName( TARGET_NS, "DocLitBindingPort"); String wsdlUrl = "http://"+getProperty("HOST")+ ":"+getProperty("HTTP_PORT")+ "/doclit_binding/doclit_binding"; QName operation = new QName(TARGET_NS, "echoAnonymAll"); ServiceFactory factory = ServiceFactory.newInstance(); Service srv = factory.createService( new URL(wsdlUrl + "?WSDL"), SERVICE_NAME); Call call = srv.createCall( PORT_NAME, operation ); // (2) Registration of complex return parameter call.setReturnType(new QName(TYPE_NS, "EchoAnonymAllElement"), EchoAnonymAllElement.class); // (3) Invocation EchoAnonymAllElement res = (EchoAnonymAllElement) call.invoke( new Object[]{req} ); System.out.println( "AnonymAll body : " +res.getVarString() ); System.out.println( "AnonymAll inner : " +res.getInnerSequence() );例15-9 document-literal起動およびSOAPElementあり、パラメータ登録なしの基本コール
// (1) Creation of Basic Call ServiceFactory sf = ServiceFactory.newInstance(); Service service = sf.createService(new QName("http://echo.demo.oracle/", "tns")); String endpoint="http://localhost:8888/test/echo"; Call call = service.createCall(); call.setTargetEndpointAddress(endpoint); // (2) No parameter registration // (3) Invocation using SOAPElement SOAPFactory soapfactory = SOAPFactory.newInstance(); SOAPElement m1 = soapfactory.createElement("echoStringElement", "tns", "http://echo.demo.oracle/"); SOAPElement m2 = soapfactory.createElement("s", "tns", "http://echo.demo.oracle/"); m2.addTextNode("Bob"); m1.addChildElement(m2); System.out.println("Request is: "); ((XMLElement) m1).print(System.out); SOAPElement resp = (SOAPElement) ((OracleCall) call).invoke(m1); System.out.println("Response is: "); ((XMLElement) resp).print(System.out);例15-10 rpc-encoded起動、複合型パラメータ登録およびJavaバインディングのある構成コール
// (1) Creation of ConfiguredCall using WSDL ServiceFactory sf = ServiceFactory.newInstance(); String endpoint="http://localhost:8888/test/echo"; Service service = sf.createService(new java.net.URL(endpoint + "?WSDL"), new QName("http://echo.demo.oracle/", "DiiRpcEchoService")); Call call = service.createCall(new QName("http://echo.demo.oracle/", "HttpSoap11"), new QName("http://echo.demo.oracle/", "echoStrings")); call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true)); call.setProperty(Call.SOAPACTION_URI_PROPERTY, ""); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/"); call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc"); // (2) Registration of complex input and return arguments QName stringArray = new QName("http://echo.demo.oracle/", "stringArray"); call.addParameter("s", stringArray, String[].class, ParameterMode.IN); call.setReturnType(stringArray, String[].class); // (3) Invocation String[] request = new String[]{"bugs", "little_pieces", "candy"}; String[] resp = (String[]) call.invoke(new Object[]{request}); System.out.println("Response is: "); for (int i = 0; i < resp.length; i++) { System.out.print(resp[i] + " "); } System.out.println();
Oracle JDeveloperで、Webサービスを使用するクライアント・アプリケーションを作成できます。Oracle JDeveloperでは、OC4J J2SE Webサービス・クライアントがサポートされます。これは、WebサービスWSDL記述からのJavaスタブの作成を可能にするという形で行われます。生成したスタブを使用して、既存のWebサービスにアクセスできます。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。
詳細は、次を参照してください。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|