47
Beginning JAX-RS HASUNUMA Kenji Vice president, GlassFish Users Group Japan [email protected] Twitter: @btnrouge December 13, 2012

Beginning JAX-RS

Embed Size (px)

DESCRIPTION

JAX-RSの基礎、JAX-RS 2.0対応版

Citation preview

Page 1: Beginning JAX-RS

Beginning JAX-RS

HASUNUMA KenjiVice president, GlassFish Users Group Japan

[email protected]: @btnrouge

December 13, 2012

Page 2: Beginning JAX-RS

What’s REST?

Page 3: Beginning JAX-RS

RESTful Webサービスとは?

RESTの3原則に基づく

•リソース (対象)

•メソッド (リソースへの操作)

•URI (リソースの識別)

Statelessである…Web本来の姿

Page 4: Beginning JAX-RS

RESTfulなもの

• Static Web sites• Weblog (Movable Type, WordPress, etc.)

• Google API• Amazon API• Twitter API• Facebook API➡RESTの3原則=メソッドの使い分け

Page 5: Beginning JAX-RS

RESTfulでないもの

• Old CGI Applications

• SOAP based Web service

• Apache Struts (※A級戦犯)

• JavaServer Faces

➡何でもかんでもPOSTで処理(StatelessなWeb本来の姿をねじ曲げている)

Page 6: Beginning JAX-RS

リソース•ネットワーク上に存在する情報

URIで識別され、状態を持つ

•性質: リクエストを受け付け、その時の状態に応じてレスポンスを返す

•静的リソース: HTMLファイルなど

•動的リソース: Webアプリケーション

Page 7: Beginning JAX-RS

メソッド

メソッド 説明GET リソースの状態を取得する

POST リソースの状態を変更するPUT リソースを追加する

DELETE リソースを削除するHEAD リソースのヘッダーを返す

OPTIONS 有効なメソッドを返す

Page 8: Beginning JAX-RS

URI (Unified Resource Identifier)

•リソースを一意に識別する• Unixなどのファイルシステムに似たパ

ス構造を持つ

→ツリー構造

•現在はURLと同義

Page 9: Beginning JAX-RS

/say/hello/to/you

/

everybodyhello

goodbyesay

you

write

to

URI = ツリー構造

Page 10: Beginning JAX-RS

JAX-RS History

Page 11: Beginning JAX-RS

JSR 311 : JAX-RS

• JSR Review : 2007-02-26

• Early Draft Review : 2007-11-23

• Public Review : 2008-06-02

• Final Draft : 2008-09-22

• Final Release : 2008-10-10

• Java EE 6 (JSR 316) : 2009-12-10

Page 12: Beginning JAX-RS

Interlude (2008-10/2009-12)

• JAX-RS 0.9 - Last big changes

- @ConsumeMime -> @Consumes

- @ProduceMime -> @Produces

• JAX-RS 1.0 - Final releaseGlassFish v3 Prelude

• JAX-RS 1.1 - Maintenance releaseJava EE 6, EJB Integration

Page 13: Beginning JAX-RS

JSR 339 : JAX-RS 2.0

• JSR Review : 2011-01-24

• Early Draft Review 3 : 2012-07-07

• Public Review : 2012-11-26

• Final Draft : ?

• Final Release : ?

• Java EE 7 (JSR 342) : 2013 Q2

JAX-RS 2.0

Page 14: Beginning JAX-RS

JAX-RSの主な実装

Jersey (RI)GlassFish Server

Jersey (RI) Oracle WebLogic ServerJersey (RI)Fujitsu Interstage AS

RESTEasyJBoss AS

RESTEasyJBoss EAP

Apache WinkIBM WebSphere AS

Apache Wink IBM WAS CEApache WinkApache Geronimo

Apache CXF Apache TomEE+その他 Hitachi uCosminexus AS不明 Tmax JEUS

Page 15: Beginning JAX-RS

Core Features

Page 16: Beginning JAX-RS

JAX-RSの処理フロー

Page 17: Beginning JAX-RS

JAX-RSの処理フロー JAX-RS 2.0

Page 18: Beginning JAX-RS

RESTとJAX-RS

•リソース →リソースクラス (POJO)•メソッド →対応するアノテーション@GET, @POST, @PUT, @DELETE

• URI →@Path•リクエスト/レスポンス→リクエスト種類ごとにメソッド

Page 19: Beginning JAX-RS

リソースクラス

•リソースの振る舞いを定義するPOJO

• @Pathアノテーション付きのクラス•リクエスト→内容を判断し適切なメソッドに振り分け

• EJB(Stateless or Singleton)で定義可→EJB連携…CDIを使用するには必須

Page 20: Beginning JAX-RS

リソースクラス

• CDI連携…EJB連携を行わなくてもCDIが使用可能に

• Bean Validation対応(引数)

•非同期通信をサポート:メソッド内で別スレッドを生成する(Concurrency Utilitiesの利用を推奨)

JAX-RS 2.0

Page 21: Beginning JAX-RS

@Path(”/hello”)

public class HelloResource {

@GET

@Consumes(”application/x-www-urlencoded”)

@Produces(”text/plain”)

public String sayHello(@QueryParam(”q”) String name) {

return “Hello, ” + name;

}

}

簡単なリソースクラスの例

Page 22: Beginning JAX-RS

@Path(”/hello”)

public class HelloResource {

@GET

@Consumes(”application/x-www-urlencoded”)

@Produces(”text/plain”)

public String sayHello(@QueryParam(”q”) String name) {

return “Hello, ” + name;

}

}

GET /hello?q=everybody

Response Request

Page 23: Beginning JAX-RS

リソースクラスのメソッド引数アノテーション 設定される値@QueryParam クエリー・パラメーターの値@FormParam フォーム・パラメーターの値@PathParam URIの一部

@MatrixParam Matrix URIの属性部分@HeaderParam リクエストヘッダーの値@CookieParam クッキーの値

(なし) リクエストボディー

Page 24: Beginning JAX-RS

@Path(”/hello/{q}”)

public class HelloResource {

@GET

@Consumes(”application/x-www-urlencoded”)

@Produces(”text/plain”)

public String sayHello(@PathParam(”q”) String name) {

return “Hello, ” + name;

}

}

GET /hello/everybody

Response Request

参考: @PathParam

Page 25: Beginning JAX-RS

@Path("/position")public class PositionResource { @GET public String getPosition( @MatrixParam("latitude") double latitude, @MatrixParam("longitude") double longitude) { return String.format("%3.2f%s %3.2f%s", Math.abs(latitude), latitude == 0.0 ? "" : (latitude > 0.0 ? "N" : "S"), Math.abs(longitude), longitude == 0.0 ? "" : (longitude > 0.0 ? "E" : "W")); }}

GET /position;latitude=35.75;longitude=139.72参考: @MatrixParam

Page 26: Beginning JAX-RS

JavaクラスとMIMEタイプの対応Javaクラス MIMEタイプ

byte[ ]任意のMIMEタイプ

(*/*)String 任意のMIMEタイプ

(*/*)InputStream任意のMIMEタイプ

(*/*)Reader

任意のMIMEタイプ(*/*)

JavaBean(JAXB)

text/xmlJavaBean

(JAXB) application/xmlJavaBean(JAXB)

application/jsonMultivaluedMap application/x-www-urlencoded

Boolean text/plain※プリミティブ型はauto-boxing

Charactertext/plain

※プリミティブ型はauto-boxingNumber

text/plain※プリミティブ型はauto-boxing

Page 27: Beginning JAX-RS

特殊なMIMEタイプ

•最も汎用的な方法:MessageBodyReaderまたはMessageBodyWriterを拡張する

• JAXBの使用が前提なら、JAXBのカスタムマーシャラー実装の方が容易

• byte[ ]やInputStreamで受けて、独自にデコードする方法もあり(結構大変)

Page 28: Beginning JAX-RS

特殊なMIMEタイプ•インターセプター:

MessageBodyReaderの前、またはMessageBodyWriterの後に実行

•リソースクラスと独立してリクエスト/レスポンスボディーを加工する。

•例: リクエスト/レスポンスのgzip圧縮※JSR 339仕様書にサンプルコードあり

JAX-RS 2.0

Page 29: Beginning JAX-RS

クライアントAPI

// Step 1 : Clientオブジェクト作成Client client = ClientFactory.newClient();

// Step 2 : ターゲット(URI)設定WebTarget target = client.target(uri);

// Step 3 : リクエストResponse response = target.request().get();

JAX-RS 2.0

Page 30: Beginning JAX-RS

クライアントAPI

// Step 3a : リクエスト(型指定)String response = target.request().get(String.class);

// Step 3b : 非同期リクエストFuture<String> response = target.request().async().get(String.class);

JAX-RS 2.0

Page 31: Beginning JAX-RS

How to deploy

Page 32: Beginning JAX-RS

JAX-RSのデプロイ方法

•Webアプリケーションとしてデプロイ

•設定方法:1.Applicationのサブクラスを作成

2.実装固有のサーブレットを登録(web.xml)

※ uCosminexusのみ非対応(独自手順に従う)

Page 33: Beginning JAX-RS

@ApplicationPath(“/app”)public MyApplication extends Application { // 通常は空の実装でよい}

下記のURLでアクセス可能:http://hostname/context-root/app/hello

Applicationのサブクラスを作成

Page 34: Beginning JAX-RS

実装固有のサーブレットを登録(Jerseyの場合)

<servlet> <servlet-name>Jersey</servlet-name> <servlet-class>com.sun.jersey.spi.container .servlet.ServletContainer</servlet-class></servlet><servlet-mapping> <servlet-name>Jersey</servlet-name> <url-pattern>/app/*</url-pattern></servlet-mapping>

Page 35: Beginning JAX-RS

実装固有のサーブレットを登録(Jerseyの場合(裏技))

@WebServlet(“/app/*”)public class MyServletContainer extends ServletContainer { // 必ず空の実装}

Page 36: Beginning JAX-RS

Extensions

Page 37: Beginning JAX-RS

コンテキストの注入

@Context で以下コンテキストを注入可能

• ServletConfig

• ServletContext

• HttpServletRequest

• HttpServletResponse→サーブレットの機能を直接利用可能(例) HttpSession、リダイレクト

Page 38: Beginning JAX-RS

プロバイダーによる拡張@Provider で機能拡張

• @Provider を付加されたクラスが自動的に読み込まれる

(具体例)

•カスタムMessageBodyReader/Writer

•フィルター/インターセプター(JAX-RS 2.0)• EJB連携(JAX-RS 1.0以前)

Page 39: Beginning JAX-RS

Non-standard Features

Page 40: Beginning JAX-RS

Jersey

•クライアントAPI

•MIME Multipartメッセージ

•フィルター

•OAuth認証

•gzip圧縮/展開

•MVCサポート

Page 41: Beginning JAX-RS

RESTEasy

•クライアントAPI

•MIME Multipartメッセージ•インターセプター•CDI連携•非同期通信•OAuth認証•gzip圧縮/展開

Page 42: Beginning JAX-RS

Apache CXF

•クライアントAPI

•MIME Multipartメッセージ

•インターセプター (CXFの定義による)•Kerberos認証

•JAX-WS連携

Page 43: Beginning JAX-RS

Apache Wink

•クライアントAPI

•MIME Multipartメッセージ

※WebSphere AS - 独自拡張あり

Page 44: Beginning JAX-RS

Conclusions

Page 45: Beginning JAX-RS

• JAX-RSはFinal release当初から完成されたAPI (JEE6以前にも実績あり)

• JAX-RS 2.0…実装依存の機能を標準化

•標準化されていない実装固有の機能も今後標準化される可能性はある

•サーブレットで可能なことはJAX-RSでもほぼ可能である

Page 46: Beginning JAX-RS

•JAX-RS = 高水準API

• JAX-RSのメリットは、RESTの概念が理解できていればWebサービスの実装が容易であること

• JAX-RSはサーブレットベースに構築されているが、通常サーブレットを意識する必要はない。