48.3. アプリケーションの応答の微調整
48.3.1. 応答構築の基本
概要
RESTful サービスでは、リソースメソッドがプレーンな Java コンストラクトを返す場合に、コンシューマーへ返される応答をより正確に制御する必要があります。JAX-RS Response
クラスを使用すると、リソースメソッドがコンシューマーに送信される戻り値をある程度制御し、応答に HTTP メッセージヘッダーとクッキーを指定できます。
Response
オブジェクトは、コンシューマーに返されるエンティティーを表すオブジェクトをラップします。Response
オブジェクトは ResponseBuilder
クラスをファクトリーとして使用してインスタンス化されます。
ResponseBuilder
クラスには、応答のメタデータを操作するために使用されるメソッドも多数あります。たとえば、ResonseBuilder
クラスには、HTTP ヘッダーとキャッシュ制御ディレクティブを設定するメソッドが含まれます。
応答と応答ビルダーの関係
Response
クラスには保護されたコンストラクターがあるため、直接インスタンス化することはできません。これらは、Response
クラスによって囲まれた ResponseBuilder
クラスを使用して作成されます。ResponseBuilder
クラスは、そこから作成された応答にカプセル化されるすべての情報のホルダーです。ResponseBuilder
クラスには、メッセージに HTTP ヘッダープロパティーを設定するすべてのメソッドもあります。
Response
クラスは、適切な応答コードの設定とエンティティーのラップを容易にするメソッドを提供します。一般的な応答ステータスコードごとにメソッドがあります。エンティティー本体または必要なメタデータを含むステータスに対応するメソッドには、関連する応答ビルダーに、情報を直接設定できるバージョンが含まれています。
ResponseBuilder
クラスの build()
メソッドは、メソッドが呼び出される際に応答ビルダーに保存されている情報が含まれる応答オブジェクトを返します。応答オブジェクトが返されると、応答ビルダーはクリーンな状態に戻ります。
応答ビルダーの取得
Response
クラスを使用した応答ビルダーの取得 に示すように、Response
クラスの静的メソッドを使用します。Response
クラスを使用した応答ビルダーの取得import javax.ws.rs.core.Response; Response r = Response.ok().build();
この方法で応答ビルダーを取得すると、複数の手順で操作できるインスタンスに、アクセスできなくなります。すべてのアクションを単一のメソッド呼び出しに配列する必要があります。
Apache CXF 固有の
ResponseBuilderImpl
クラスの使用。このクラスを使用すると、応答ビルダーを直接操作できます。ただし、すべての応答ビルダーの情報を手動で設定する必要があります。例48.1「
ResponseBuilderImpl
クラスを使用した応答ビルダーの取得」は、ResponseBuilderImpl
クラスを使用してResponse
クラスを使用した応答ビルダーの取得 を書き換える方法を表しています。例48.1
ResponseBuilderImpl
クラスを使用した応答ビルダーの取得import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl; ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.status(200); Response r = builder.build();
注記Response
クラスのメソッドから返されるResponseBuilder
をResponseBuilderImpl
オブジェクトに割り当てることもできます。
補足情報
Response
クラスの詳細は、Response
クラスの Javadoc を参照してください。
ResponseBuilder
クラスの詳細は、ResponseBuilder
クラスの Javadoc を参照してください。
Apache CXF ResponseBuilderIml
クラスの詳細は、ResponseBuilderImpl
Javadoc を参照してください。