応用 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 の形式でメッセージを交換 中立なデータ形式 ( 事実上の標準 ) システム、言語、アプリケーション非依 存 メッセージが「構造」を持つ データ構造の定義は XML Schema で 処理の呼び出しも表現 (JAX-RPC)
SOAP のメッセージの構造 <SOAP-ENV:Envelope xmlns:SOAP-ENV= “ ” > Hello
SOAP メッセージの例 (Google) <SOAP-ENV:Envelope xmlns:SOA-ENV =" xmlns:xsi=" xmlns:xsd=" <ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch “ SOAP-ENV:encodingStyle= " 8NfcnBhQFHL4QZbU3pX21B7NVhVZ+R+a Tatsuo Ueda
SOAP の 実装 XML Apache org の WS-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) から メソッドの呼び出しを表現
Web サービスでの例 (2) メソッドの返り値を表現
Java に「翻訳する」と <input message="typens:doGetCachedPage"/> <output message="typens:doGetCachedPageResponse"/> xsd:string -> Java の String クラス String result = doSpellingSuggestion( String key, String phrase );
Java に「翻訳する」と (2) 複雑な型は Schema で定義可能 ( Java のクラスに対応 ) :
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( " ); Response response = call.invoke ( endPoint, "" ); Parameter result = response.getReturnValue (); System.out.println( response.getBodyPart(0).getContent() );