応用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() );
© Copyright 2024 ExpyDoc