SOAPとRPC

応用Java(Java/XML) 第10回
2006年7月14日
植田龍男
後半の内容の予定
XPath (6/9)、XSLT (6/16)
 名前空間(Namespace) (6/16)
 XML文書の妥当性の検証(6/23)
DTD, W3C XML Schema
 SOAPのメッセージング(7/7)
 RMI と JAX-RPC(7/14)
 試験(7/21)

XML技術の階層構造





パーサ(最下層の字句解析) SAX, DOM
一般的なXML処理
検索(XPath)、変換(XSLT)
スキーマ言語( W3C XML Schema)
メッセージの交換(SOAP)
サーバサイドの技術
Webサービス、 UDDI
SOAPとは?



XMLの形式でメッセージを交換
中立なデータ形式(事実上の標準)
システム、言語、アプリケーション非依存
http://www.w3.org/2000/xp/Group/
メッセージが「構造」を持つ
データ構造の定義は XML Schema で
処理の呼び出しも表現(JAX-RPC)
SOAP のメッセージの構造
<SOAP-ENV:Envelope
xmlns:SOAP-ENV=
“ http://schemas.xmlsoap.org/soap/envelope/”>
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<mymessage> Hello </mymessage>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAPメッセージの例(Google)
<SOAP-ENV:Envelope
xmlns:SOA-ENV
="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<ns1:doGoogleSearch
xmlns:ns1="urn:GoogleSearch“
SOAP-ENV:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/">
<key xsi:type="xsd:string">
8NfcnBhQFHL4QZbU3pX21B7NVhVZ+R+a</key>
<q xsi:type="xsd:string">Tatsuo Ueda</q>
SOAP の 実装
XML Apache org の WS-SOAP
http://ws.apache.org/soap/
(Java Mail, Java Beans Activationに依存)
 org.apache.soap パッケージ
Envelop, Header, Body, Fault クラスなど
 org.apache.soap.messaging パッケージ
Message クラス
 org.apache.soap.transport パッケージ

SOAP API の使用例(1)
Document doc =
db.parse ( new InputSource (source) );
// メッセージ送信
Envelope env =
Envelope.unmarshall( doc.getDocumentElement() );
Message msg = new Message ();
msg.send (
new URL(url), "urn:wakhok.ac.jp-jax-soap1", env );
SOAP API の使用例(2)
// メッセージ受信
SOAPTransport st =
msg.getSOAPTransport ();
BufferedReader br = st.receive();
String line;
while ( (line = br.readLine ()) != null ) {
System.out.println ( line );
}
RPC(Remote Procedure Call)



Remote -- 別のマシンにネットワークで
Procedure – 何らかの処理
(C言語なら関数、Javaならメソッド)
Call – 呼び出す仕組み
SOAPメッセージを通じてRPC



実際の通信部分はSOAPメッセージ
(システム、言語に中立)
アプリケーションから見ると処理の呼び出
しとして記述できる
応用例) Webサービス
Webサービスでの例(1)

Google Web Service の定義(WSDL)から
<message name="doSpellingSuggestion">
<part name="key" type="xsd:string"/>
<part name="phrase“ type="xsd:string"/>
</message>
メソッドの呼び出しを表現
Webサービスでの例(2)
<message
name="doSpellingSuggestionResponse">
<part name="return“ type="xsd:string"/>
</message>
メソッドの返り値を表現
Javaに「翻訳する」と
<operation name="doGetCachedPage">
<input
message="typens:doGetCachedPage"/>
<output
message="typens:doGetCachedPageResponse"/>
</operation>
xsd:string -> Java の Stringクラス
String result = doSpellingSuggestion(
String key, String phrase );
Javaに「翻訳する」と(2)
複雑な型は Schema で定義可能
(Javaのクラスに対応)
<xsd:complexType name="ResultElement">
<xsd:all>
<xsd:element name="URL“ type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
:
</xsd:all>
</xsd:complexType>

Apache SOAP のAPIの実装

org.apache.soap.rpc パッケージ
Call, Parameter, Response クラスを提供
サンプルプログラム(1)
Call call = new Call ();
call.setTargetObjectURI (
"urn:GoogleSearch");
call.setMethodName (
"doSpellingSuggestion" );
call.setEncodingStyleURI(
Constants.NS_URI_SOAP_ENC );
サンプルプログラム(2)
Vector params = new Vector ();
params.addElement(
new Parameter(
"key", String.class, key, null) );
params.addElement( new Parameter(
"phrase", String.class, phrase, null) );
call.setParams (params);
サンプルプログラム(3)
URL endPoint = new URL(
"http://api.google.com/search/beta2" );
Response response
= call.invoke ( endPoint, "" );
Parameter result =
response.getReturnValue ();
System.out.println(
response.getBodyPart(0).getContent() );