2003年度 データベース論

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());