レスポンスのステータスコード

【前提条件】

[環境]

【概要】

javax.ws.rs.core.Responseが提供している
Responseオブジェクト作成メソッドについて調べてみました。

【ソース】

どのメソッドが
どのHTTPステータスコードのレスポンスを返却するかを
調べるためのソースです。

package jp.glory.ui.service;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Variant;

import com.sun.jersey.api.client.ClientResponse.Status;

@Path("/service/response")
public class ResponseService {

    private static final String REDIRECT_PATH = "http://localhost:9090/";

    @Context
    private HttpServletRequest request = null;

    @Path("seeOther")
    @GET
    public Response seeOther() throws URISyntaxException {

        Response response = Response.seeOther(new URI(REDIRECT_PATH)).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("temporaryRedirect")
    @GET
    public Response temporaryRedirect() throws URISyntaxException {

        Response response = Response.temporaryRedirect(new URI(REDIRECT_PATH)).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("created")
    @GET
    public Response created() throws URISyntaxException {

        Response response = Response.created(new URI(REDIRECT_PATH)).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("fromResponse")
    @GET
    public Response fromResponse() throws URISyntaxException {

        Response response = Response.fromResponse(seeOther()).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("noContent")
    @GET
    public Response noContent() throws URISyntaxException {

        Response response = Response.noContent().build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("notAcceptable")
    @GET
    public Response notAcceptable() throws URISyntaxException {

        Response response = Response.notAcceptable(new ArrayList<Variant>()).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("notModified")
    @GET
    public Response notModified() throws URISyntaxException {

        Response response = Response.notModified().build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("ok")
    @GET
    public Response ok() throws URISyntaxException {

        Response response = Response.ok().build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("serverError")
    @GET
    public Response serverError() throws URISyntaxException {

        Response response = Response.serverError().build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

    @Path("status")
    @GET
    public Response status() throws URISyntaxException {

        Response response = Response.status(Status.BAD_GATEWAY).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }
}

GETメソッドのみを許容しているので、
実行する時はブラウザからURLを直接たたいて確認します。

[各メソッドで作成したReponseのステータスコード]
メソッド ステータスコード
ok 200
created 201
noContent 204
seeOther 303
notModified 304
temporaryRedirect 307
notAcceptable 406
serverError 500
status 任意
fromResponse 任意

メソッド名はHTTPステータスコードの名称と同じです。
statusメソッドとfromResponseメソッドは
任意で指定ができるものなので
ステータスコードの名前と一致するものはありません。

【考察】

[okメソッド]

Webアプリケーションでは一番使うメソッドになると思います。

JSPの画面を返却する場合、下記のようなコードになります。

    @Path("ok2")
    @GET
    @Produces(MediaType.TEXT_HTML)
    public Response ok2() throws URISyntaxException {

        Viewable view = new Viewable("/sample.jsp", new SampleJspBean("test", 1986));
        Response response = Response.ok().entity(view).type(MediaType.TEXT_HTML).build();

        System.out.println(request.getRequestURI());
        System.out.println(response.getStatus());

        return response;
    }

entityメソッドは返却するレスポンスのオブジェクトを指定します。
typeメソッドでは返却するレスポンスのコンテンツタイプを返却します。

okメソッドを使ったJSPの返却ですが、
下記のソースと同じ動きをします。

    @Path("ok2")
    @GET
    @Produces(MediaType.TEXT_HTML)
    public Response ok2() {

        return new Viewable("/sample.jsp", new SampleJspBean("test", 1986));
    }

Viewableメソッドを使用したほうが簡単にかけます。

[fromResponseメソッド]

fromResponseメソッドで渡したResponseオブジェクトの
コピーを行うメソッドのようです。

Javadocにシャローコピーと書かれているので、
シャローコピーのようです。

このメソッドの使い道がいまいちわからないですね・・・