WebサービスII (第12回) 2007年12月19日 植田龍男
おわび: 先週は急に休講となりすみませんでした
本日の目的 Webサービスの統合と規格化(続き) Jerseyプロジェクト+WADLプロジェクト サーバ側 (WADLの自動生成) - Jersey クライアント側の自動生成 - WADL
前回までやったこと Jerseyプロジェクト RESTfulなWebサービスをPOJOから WADLの情報の自動生成=>クライアントへ wadl2javaツール
Jersey の自動処理 HelloWorldService を記述するWADLが 自動生成 com/sun/ws/rest/wadl/resource の下に application.wadl 同じディレクトリに WadlResouce のソースとバイトコード生成 =>application.wadlの情報を提供する
サーバ側の開発の仕組み apt + 専用のプロセッサによるソースと WADLの自動生成=>RESTfulサービスで 公開 http://sitename/applicaiton.wadl
WADLプロジェクト http://wadl.dev.java.net/ バイナリパッケージを展開 http://wadl.dev.java.net/ バイナリパッケージを展開 ~ -+- wadl -+- bin -+- wadl2java <-- UNIX用のツール本体 | +- wadl2java.bat <-- Windows用のツール本体 +- lib -+- wadl-cmdline-1.0-SNAPSHOT.jar +- samples -+- ant -+- build.xml <-- ant でビルド +- cmdline -+- run <-- UNIX用 | +- run.cmd <-- Windows用 +- maven -+- pom.xml <-- maven でビルド +- share -+- YahooSearch.wadl
WADLからJavaへ ツール wadl2java WADL の情報から クライアント側を生成 Endpoint.java サービスにアクセスするクラス JAXBによるデータのクラス
YahooSearchのWADLの場合 Endpointクラス NewsSearchクラス サービスにアクセスするメソッドを提供 ResultSet, Result など 返されるXML文書の各要素に対応 (cf. JAXB, xjc )
YahooSearch の WADL(1) <application xmlns="http://research.sun.com/wadl/2006/10 "> <grammars> <include href="NewsSearchResponse.xsd"/> <include href="NewsSearchError.xsd"/> </grammars> :
YahooSearch の WADL(2) <resources base="http://api.search.yahoo.com/New sSearchService/V1/"> <resource path="newsSearch"> : <method href="#search"/> </resource> </resources>
YahooSearch の WADL(3) <method name="GET" id="search"> <request> <param name="query" type="xsd:string" required="true" style="query"> </param><param name="results" type="xsd:int" default="10" </param>
対応する URLのパターン http://http://api.search.yahoo.com/News SearchService/V1/newsSearch?query=Ja pan&results=20&.....
YahooSearch の WADL(4) <response> <representation mediaType="application/xml" element="yn:ResultSet"> </representation> </response> </method> </application>
返されるXML文書の例 <ResultSet xmlns=”urn:yahoo:yn”> <Result> <title>... </title> <url> ... </url> : </Result> <Result> ... </Result> </ResultSet>
YahooSearchのクライアントの例 import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { YahooSearchのクライアントの例 import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { try { :
YahooSearchのクライアントの例 import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { YahooSearchのクライアントの例 Endpoint.NewsSearch search = new Endpoint.NewsSearch(); ResultSet set = search.getAsResultSet( "jaxws_restful_sa mple", args[0] ); // 第1引数はID情報、第2引数は検索ワード // URI などの情報は表に現れない!
YahooSearchのクライアントの例 import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { import java.util.List; import com.yahoo.search.*; public class Client { public static void main( String[] args ) { YahooSearchのクライアントの例 // 結果の取り出し // ここでも POJO のみの記述 List<Result> list = set.getResultList(); for( Result result : list ) { System.out.println( result.getTitle() + ":" + result.getSummary() ); }
別のWADLを指定してみる 前回の HelloWorldResponse から自動生 成された application.wadl plain/text のメッセージを返す
Helloworld の WADL(全体) <application xmlns="http://research.sun.com/wadl/2006/10"> <resources base="http://localhost:9998/"> <resource path="/helloworld"> <method name="GET"> <response> <representation mediaType="text/plain"/> </response> </method> </resource> </resources> </application>
Helloworld の WADL(前半部) <application xmlns="http://research.sun.com/wadl/2006/10"> <resources base="http://localhost:9998/"> <resource path="/helloworld"> <method name="GET"> <response> <representation mediaType="text/plain"/>
生成された Endpoint.java public class Endpoint { public static class Helloworld { public Helloworld() { … } public DataSource getAsTextPlain() { … } }
クライアントプログラム import hello.Endpoint; import java.io.*; import javax.activation.DataSource; public class HelloClient { public static void main( String[] args ) {
クライアントプログラム(2) Endpoint.Helloworld service = new Endpoint.Helloworld(); DataSource source = service.getAsTextPlain(); Reader reader = new InputStreamReader( source.getInputStream() );
手順のまとめ Jerseyによるサーバサイドと WADLの提供 POJOからの自動生成 第10回の課題を参照:ポイントは apt によるアノテーションの処理 WADL の取得(クライアント側) WADLからのJavaの自動生成 第11回の課題を参照: ポイントは wadl2java
今後の予定 1/9 第13回:「Webサービスの未来(1)」 1/16 第14回:「Webサービスの未来(2)」 1/23 第15回:試験 (2階実習室にて)