24.4.3 javax.ws.rs.core.Request
javax.ws.rs.core.Requestは,RFC 2616で規定される「コンテントネゴシエーション(Content Negotiation)」に必要な機能を提供するコンテキストです。
ルートリソースクラスのフィールドにインジェクトされるjavax.ws.rs.core.Requestの使用例を次に示します。
package com.sample.resources; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.EntityTag; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; //ルートリソースクラス @Path("/root") public class Resource { //Contextアノテーションを使用してRequestをインジェクトするフィールド private @Context Request request; //コンテントネゴシエーションで利用するHTTP Entity Tag private EntityTag eTag = new EntityTag("a-resource-status-specific-tag"); //リソースメソッド @GET public Response getData() { ResponseBuilder rb = null; //コンテントネゴシエーション(プレコンディションの評価)を行う // プレコンディションに合えばnull,合わなければ // 適切なETag HTTPヘッダやステータスコード(412: Precondition Failed) が // 設定されたResponseBuilderオブジェクトが取得される rb = request.evaluatePreconditions(this.eTag); if (rb != null) { //プレコンディションに合わない場合,ResponseBuilderオブジェクトから //HTTPレスポンスを生成してそのまま返す return rb.build(); } else { //プレコンディションに合う場合,要求のデータを返す String data = "Some Information"; return Response.ok().entity(data).build(); } } }
ルートリソースクラスcom.sample.resources.Resourceを含むWebアプリケーション(WARファイル)のコンテキストルートが"example"で,Webアプリケーションが"sample.com"というホストで公開されているとします。この例で,If-Match HTTPヘッダに"a-resource-status-specific-tag"を指定したURL"http://sample.com/example/root"に対するHTTP GETリクエストでは,まずrequestフィールドにjavax.ws.rs.core.Requestコンテキストがインジェクトされ,その後HTTP GETリクエストを処理できるgetData()メソッドが呼び出されます。このため,getData()メソッドでは,コンテントネゴシエーション(この例ではHTTP リクエストのIf-Match HTTPヘッダとリソースが保持するHTTP EntityTagの比較)が行われ,"Some Information"という値が取得されます。