CLOVER🍀

That was when it all began.

JAX-RSのUriInfoから取得できる、各種URI・パスの情報を見てみる

JAX-RSのパスやURIの組み立てにまだまだ不慣れなところがありまして、特に「http://〜」のような絶対URI形式になったりするとまだまだ迷ったりします。

というわけで、自サーバまわりの情報を使ってURIを組み立てるのに使う、UriInfoを使って何が取れるのか確認してみました。主にURI、パスまわりを中心に。

まずは、JAX-RS有効化のためのクラス。
src/main/java/org/littlewings/javaee7/uriinfo/JaxrsApplication.java

package org.littlewings.javaee.uriinfo;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest")
public class JaxrsApplication extends Application {
}

@ApplicationPathアノテーションに与えるパスは、「rest」とします。

src/main/java/org/littlewings/javaee7/uriinfo/UriInfoResource.java

package org.littlewings.javaee.uriinfo;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.UriBuilder;

@Path("uri-info")
public class UriInfoResource {
    @GET
    @Path("index")
    @Produces(MediaType.TEXT_PLAIN)
    public String index(@Context UriInfo uriInfo, @Context HttpServletRequest req) {
        String sep = System.lineSeparator();

        StringBuilder builder = new StringBuilder();
        builder.append("UriInfo#getAbsolutePath = ").append(uriInfo.getAbsolutePath()).append(sep);
        builder.append("UriInfo#getBaseUri = ").append(uriInfo.getBaseUri()).append(sep);
        builder.append("UriInfo#getRequestUri = ").append(uriInfo.getRequestUri()).append(sep);
        builder.append("UriInfo#getPath = ").append(uriInfo.getPath()).append(sep);

        builder.append(sep);

        builder.append("HttpServletRequest#getContextPath = ").append(req.getContextPath()).append(sep);
        builder.append("HttpServletRequest#getRequestURI = ").append(req.getRequestURI()).append(sep);
        builder.append("HttpServletRequest#getRequestURL = ").append(req.getRequestURL()).append(sep);
        builder.append("HttpServletRequest#getServletPath = ").append(req.getServletPath()).append(sep);
        builder.append("HttpServletRequest#getPathInfo = ").append(req.getPathInfo()).append(sep);
        builder.append("HttpServletRequest#getPathTranslated = ").append(req.getPathTranslated()).append(sep);
        builder.append("HttpServletRequest#getQueryString = ").append(req.getQueryString()).append(sep);

        builder.append(sep);

        builder.append("UriBuilder#fromUri = ").append(UriBuilder.fromUri("relative").build()).append(sep);
        builder.append("UriBuilder#fromUri = ").append(UriBuilder.fromUri("/slash").build()).append(sep);
        builder.append("UriBuilder#fromResource = ").append(UriBuilder.fromResource(UriInfoResource.class).build()).append(sep);

        return builder.toString();
    }
}

オマケで、HttpServletRequestから取れる各種情報と、UriBuilderを使ったURI構築まで。後者は、いらんかった…。まあ、メモ的に残しておきます。

これに対して、以下のようなリクエストを実行。

$ curl http://localhost:8080/javaee7-web/rest/uri-info/index?param=%E3%83%86%E3%82%B9%E3%83%88

QueryStringの部分は、「param=テスト」です(笑)。

なお、WARファイルの名前は「javaee7-web.war」としています。なので、コンテキストパスは「javaee7-web」ですね。

レスポンスは、こんな感じ。

UriInfo#getAbsolutePath = http://localhost:8080/javaee7-web/rest/uri-info/index
UriInfo#getBaseUri = http://localhost:8080/javaee7-web/rest/
UriInfo#getRequestUri = http://localhost:8080/javaee7-web/rest/uri-info/index?param=%E3%83%86%E3%82%B9%E3%83%88
UriInfo#getPath = /uri-info/index

HttpServletRequest#getContextPath = /javaee7-web
HttpServletRequest#getRequestURI = /javaee7-web/rest/uri-info/index
HttpServletRequest#getRequestURL = http://localhost:8080/javaee7-web/rest/uri-info/index
HttpServletRequest#getServletPath = /rest
HttpServletRequest#getPathInfo = /uri-info/index
HttpServletRequest#getPathTranslated = null
HttpServletRequest#getQueryString = param=%E3%83%86%E3%82%B9%E3%83%88

UriBuilder#fromUri = relative
UriBuilder#fromUri = /slash
UriBuilder#fromResource = uri-info

RequestUriだとQueryStringまで含めて全体が取れ、AbsolutePathだとQueryStringは付かない(Pathだから、そりゃそうだ)という感じですね。

UriInfo#getAbsolutePath = http://localhost:8080/javaee7-web/rest/uri-info/index
UriInfo#getBaseUri = http://localhost:8080/javaee7-web/rest/
UriInfo#getRequestUri = http://localhost:8080/javaee7-web/rest/uri-info/index?param=%E3%83%86%E3%82%B9%E3%83%88
UriInfo#getPath = /uri-info/index

BaseUriだと、ApplicationPathに設定したところまでが取れるようですね。残りは、Pathで取得可能と。

HttpServletRequestから見ると、ApplicationPathはServletPathということになっている模様。

HttpServletRequest#getServletPath = /rest

まあ、HttpServletRequestで取れるパスの構成要素は、こちらを見るのがよいでしょう。
サーブレットパスの構成要素を取得する
http://www.atmarkit.co.jp/fjava/javatips/067jspservlet030.html

まさに、メモ的に。