WSDL と JAX-RPC ソフトウェア特論 第10回 / 2004-07-20 お知らせ レポート課題を出しています。 提出は 7/30 (金) まで。 きょうの目標 WSDL と JAX-RPC の関係について理解す る。 Google Web APIs と スタブの生成 Google Web APIs を使うには? Google の Webサー ビスにアクセスするた めのクライアントプロ グラムと、スタブが必 要になる。 スタブの生成 (1) Google Web APIs に付属している WSDL から生成する。自分でプログラミングする 必要はない。 生成には、JWSDP に含まれている wscompile というツールを使う。 wscompile を実行すると、32個のクラス ファイルが生成される。 スタブの生成 (2) 生成されたスタブ GoogleSearchService GoogleSearchService_Impl GoogleSearchPort GoogleSearchPort_Stub GoogleSearchResult ResultElement などなど クライアントプログラムの作成 クライアントプログラムでは、スタブを利用 して Google の Webサービスにアクセスす る。 クライアントプログラムと WSDLの対応 WSDLの全体的な構造 <definitions> <types> <message> <portType> <binding> <service> </definitions> …… </types> …… </message> …… </portType> …… </binding> …… </service> WSDLの各要素の概要 service要素では、主にエンドポイントを指定する。 binding 要素では、主に Webサービスの通信の 方法について定める。 portType 要素は、Javaのインタフェースに相当 する。 Message要素では、portType 要素の input・ output 要素で使われる型を指定する。 types 要素では、XML Schema を使って、 新し い型を定義する。 スタブの生成 (1) // (1)スタブの生成 GoogleSearchPort_Stub stub = (GoogleSearchPort_Stub) (new GoogleSearchService_Impl() .getGoogleSearchPort()); スタブの生成 (2) 省略せずに書いたソース GoogleSearchService service = new GoogleSearchService_Impl(); GoogleSearchPort port = service.getGoogleSearchPort(); GoogleSearchPort_Stub stub = (GoogleSearchPort_Stub)port; スタブの生成 (3) service 要素の名前との対応 GoogleSearchService service = new GoogleSearchService_Impl(); <service name="GoogleSearchService"> …… </service> スタブの生成 (4) GoogleSearchService インタフェース GoogleSearchService_Impl GoogleSearchService の実装クラス スタブの生成 (5) portType 要素の名前との対応 GoogleSearchPort port = service.getGoogleSearchPort(); <portType name="GoogleSearchPort"> ...... </portType> スタブの生成 (6) GoogleSearchPort_Stub stub = (GoogleSearchPort_Stub)port; GoogleSearchPort GoogleSearchPort_Stub インタフェース GoogleSearchPort の実装クラス この後は、この GoogleSearchPort_Stub を操作 して、Google の Webサービスにアクセスする。 スタブにエンドポイントを 設定する (1) // (2)スタブにエンドポイントを設定する stub._setProperty( Stub.ENDPOINT_ADDRESS_PROPERTY, “http://api.google.com/search/beta2” ); スタブにエンドポイントを 設定する (2) エンドポイント = Webサービスを提供して いるURL この Web サービスは、 http://api.google.com/search/beta2 とい うURLにアクセスする。 <soap:address location= "http://api.google.com/search/beta2"/> Googleの検索処理 (1) // (3)Google の検索処理を呼び出す // “xxxxx” が ライセンスキー // args[0] が検索したい言葉 GoogleSearchResult result = stub.doGoogleSearch(“xxxxx", args[0], 1, 10, false, "", false, "", "", ""); Googleの検索処理 (2) stub.doGoogleSearch(……) GoogleSearchPort_Stub クラスは、 GoogleSearchPort インタフェースを実装し ている。 GoogleSearchPort WSDL の portType 要素に対応 Googleの検索処理 (3) WSDL の portType 要素 <portType name="GoogleSearchPort"> ...... <operation name="doGoogleSearch"> <input message= "typens:doGoogleSearch"/> <output message= "typens:doGoogleSearchResponse"/> </operation> </portType> Googleの検索処理 (4) GoogleSearchPort インタフェース public interface GoogleSearchPort extends java.rmi.Remote { public byte[] doGetCachedPage(......) throws RemoteException; public String doSpellingSuggestion(......) throws RemoteException; public GoogleSearchResult doGoogleSearch(......) thorws RemoteException; } Googleの検索処理 (5) メソッド呼び出しとWSDL stub.doGoogleSearch(……); <operation name="doGoogleSearch"> <input message="typens:doGoogleSearch"/> <output message= "typens:doGoogleSearchResponse"/> </operation> Googleの検索処理 (6) メソッドの引数 stub.doGoogleSearch(“xxxxx", args[0], 1, 10, false, "", false, "", "", ""); doGoogleSearch メソッドには、10個の引 数がある。 Googleの検索処理 (7) portType 要素での引数の指定 <portType name="GoogleSearchPort"> <operation name="doGoogleSearch"> <input message= "typens:doGoogleSearch"/> <output message= "typens:doGoogleSearchResponse"/> </operation> </portType> Googleの検索処理 (8) message 要素での引数の指定 <message name="doGoogleSearch"> <part name="key“ type="xsd:string"/> <part name="q“ type="xsd:string"/> ...... </message> メソッドの10個の引数の定義は、ここにある。 Googleの検索処理 (9) 引数のそれぞれの型 <message name="doGoogleSearch"> <part name="key“ type="xsd:string"/> <part name="start“ type="xsd:int"/> ...... </message> xsd:string は Java の String 型に、 xsd:int は Java の int 型にそれぞれ変換 される。 Googleの検索処理 (10) doGoogleSeach の引数の型 public GoogleSearchResult doGoogleSearch( String key, String q, int start, int maxResults, boolean filter, String restrict, boolean safeSearch, String lr, String ie, String oe) throws RemoteException; Googleの検索処理 (11) メソッドの返値 GoogleSearchResult result = stub.doGoogleSearch(“xxxxx", args[0], 1, 10, false, "", false, "", "", ""); GoogleSearchResult 型のオブジェクトが 返値となる。 Googleの検索処理 (12) portType 要素での返値の指定 <portType name="GoogleSearchPort"> <operation name="doGoogleSearch"> <input message= "typens:doGoogleSearch"/> <output message= "typens:doGoogleSearchResponse"/> </operation> </portType> Googleの検索処理 (13) message 要素での返値の指定 <message name="doGoogleSearchResponse"> <part name=“return” type="typens:GoogleSearchResult"/> </message> メソッドの返値として、GoogleSearchResult とい う型が定義されている。 具体的な定義は、types要素の中で Googleの検索処理 (14) types 要素での新しい型の指定 <xsd:complexType name="GoogleSearchResult"> <xsd:all> <xsd:element name="documentFiltering" type="xsd:boolean"/> <xsd:element name="resultElements" type="typens:ResultElementArray"/> ...... </xsd:all> </xsd:complexType> Googleの検索処理 (15) types 要素と Java の型 types 要素で指定された型 (GoogleSearchResult) が、Java のオブ ジェクトとなる。 検索結果の出力 (1) // (4)検索結果の出力 ResultElement[] elements = result.getResultElements(); for (int i=0; i<10; i++) { System.out.println(i); System.out.println(elements[i].getTitle()); System.out.println(elements[i].getURL()); System.out.println(); } 検索結果の出力 (2) result のメソッド呼び出し result.getResultElements(); <xsd:complexType name="GoogleSearchResult"> <xsd:all> <xsd:element name="resultElements" type="typens:ResultElementArray"/> ...... </xsd:all> </xsd:complexType> 検索結果の出力 (3) GoogleSearchResult のプロパティ types 要素で定義された GoogleSearchResult には、いくつかの子 要素がある。 そうした子要素は、Java オブジェクトの GoogleSearchResult ではプロパティとなっ ている。 getter (get + 子要素名のメソッド) でアクセス できる。 検索結果の出力 (4) 返値が新しい型になる ResultElement[] elements = result.getResultElements(); <xsd:complexType name="GoogleSearchResult"> <xsd:all> <xsd:element name="resultElements" type="typens:ResultElementArray"/> ...... </xsd:all> </xsd:complexType> 検索結果の出力 (5) types 要素中のResultElement 型 <xsd:complexType name="ResultElement"> <xsd:all> <xsd:element name="URL" type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> ...... </xsd:all> </xsd:complexType> 検索結果の出力 (6) ResultElement オブジェクトの利用 System.out.println(elements[i].getTitle()); System.out.println(elements[i].getURL());
© Copyright 2024 ExpyDoc