Webサービス II (第1回)

WebサービスII (第13回)
2008年1月9日
植田龍男
本日の目的
Webサービスの歴史と将来の展望(1)
WSDL 2.0 の登場
Jerseyプロジェクト Ver 0.5
による開発
この講義でやったこと
 Java SE 6 と JAXB, JAX-WS 2.0 のAPI
 JAX-WS 2.0の枠組みによる開発
サーバサイドは POJO + アノテーション
アプリケーションサーバ Glassfish
RESTful なWebサービスの存在
RESTful なWebサービスの新しい開発方法
Jerseyプロジェクト、WADL
2種類のWebサービス


「古典的」 Webサービス
SOAPメッセージの交換
RPC型(メソッドの呼び出しをインタフェー
スで定義)
RESTful なWebサービス
URIでアクセス可能、「裸の」XMLを送信
それぞれの長所・短所(昔)
古典的:
WSDLによる厳格な定義
標準化・統合が保証
開発者の負担大、広い普及が遅れ
 RESTful:
開発の自由度大、手軽、普及が速い
標準化、統合は視野外
開発者にある程度のスキルは必要

それぞれの長所・短所(今)
古典的:
WSDLによる厳格な定義
標準化・統合が保証
EoDの普及で負担は減
 RESTful:
開発の自由度大、手軽、普及が速い
標準化・統合の可能性
EoDの導入も

復習:開発の手順の比較(1)


Java SE 6 の SOAP型の開発
@Webservice アノテーションが付加され
た POJO からスタート
Jersey の RESTful 型の開発
@UriTemplate, @HttpMethod が付加さ
れた POJO からスタート
復習:開発手順の比較(2)


SOAP型
ツール wsgen によるソースとWSDLの自
動生成 => サーバが公開
http://sitename/servicename?wsdl
RESTful型
apt + 専用のプロセッサによるソースと
WADLの自動生成=>RESTfulサービスで
公開
http://sitename/applicaiton.wadl
RESTful 型の課題
アノテーションの記述方法や処理方法のよ
り洗練されたスタイル
(Jerseyはまだ開発途上)
 すべてのサービスでWADLの存在の保証
 WSDLとの統合

WSDL 2.0 まで
現行のWSDL Ver 1.1
(原理的にはSOAP、HTTPに非依存
実質的には HTTP上のSOAP )
 その後に追加したい機能の登場
WS-I による標準化の試み
 RESTful なWebサービスの普及
(「HTTP と SOAP」という表現)

Jersey 0.4 の自動処理
 J2SE 5.0 の apt ツールでアノテーション
を処理
HelloWorldService を記述するWADLを
自動生成
com/sun/ws/rest/wadl/resource
の下に application.wadl
 WadlResouce のソースとバイトコード生成
=>application.wadlの情報を提供する
Jersey 0.4 の不便だった点
 apt の処理は「古い」スタイル
 手動で apt の処理を呼び出す必要
(アノテーション処理の理解が必要)
アノテーションの名称や形式の意味が直観
的にわかりにくい
Jersey 0.5 では
処理は POJOのコンパイルのみ
javac -cp $LIB/jsr311-api.jar Source.java
 application.wadl を提供するクラスの存在は
意識する必要がない(サーバ側で自動生成)
 よりわかりやすいアノテーション
@Path, @GET など

Jersey 0.4 の POJO
@UriTemplate("/helloworld")
public class HelloWorldResource {
@HttpMethod("GET")
@ProduceMime("text/plain")
public String getClichedMessage() {
return "Hello World!";
}
}
Jersey 0.5 の POJO
@Path("/helloworld")
public class HelloWorldResource {
@GET
@ProduceMime("text/plain")
public String getClichedMessage() {
return "Hello World!";
}
}
Jersey 0.4 => 0.5
WADLの利用はオプショナルではなくデフ
ォルトとなった(常に利用可能)
=WADLやそれを提供するクラスの存在は
意識しなくてより(知識がなくてもよい)
 apt やアノテーション処理の知識も不要
 JAX-WS 2.0 の枠組みによる SOAP型の
開発スタイルのレベルにより近づいた
 開発スタイルの「統合」も近い?

WADLプロジェクト


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
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月の予定



1/9 第13回:「Webサービスの未来(1)」
1/16 第14回:「Webサービスの未来(2)」
1/23 第15回:試験 (2階実習室にて)