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
まさに、メモ的に。