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"という値が取得されます。