Hitachi

Cosminexus V11 アプリケーションサーバ Webサービス開発ガイド


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