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