반응형
REST의 중요한 점 중의하나가 URIs이다.
java.net.URI를 이용해서 URI를 만들고 쓰는 법은 쉽지 않다.
만약, baseUri로 "http://localhost:8080/base"가 있고, 여기에 상대경로를 다음과 같은 상대경로를 추가하고 싶다. "a:b;param=matrix/hello world"
그래서,
java.net.URI를 이용해 이런 상대경로를 만들수가 없다.
왜냐하면, 들어가선 안될 문자가 있다. "hello world"안에 공백이 있어서 invalid한 URI가 된다.
baseUri.toString() + '/' + "a:b;param=matrix/hello world"
그다음 문제로는 java.net.URI는 "a:"를 스키마로 추정해서, 이렇게 해줘야한다.
이러저러한 처리를 해주고 나면 java.net.URI를 쓴 결과는...
이렇게 된다.. 아..ㅠㅠ
이래서!! JAX-RS에선 UriBuilder를 제공한다. URI를 좀더 심플하고 간단하게 만들기 위해서..
UriBuilder를 이용하면,
아니면, 좀 더 명시적으로 지정해주려면
또한 UriBuilder는 URI templates도 제공한다.
UriInfo와 UriBuilder를 이용해서 URI만드는 예
참고
Building URIs
Jersey 1.0.3 User Guide 중 1.7. Building URIS
UriBuilder API
java.net.URI를 이용해서 URI를 만들고 쓰는 법은 쉽지 않다.
만약, baseUri로 "http://localhost:8080/base"가 있고, 여기에 상대경로를 다음과 같은 상대경로를 추가하고 싶다. "a:b;param=matrix/hello world"
그래서,
"http://localhost:8080/base/a:b;param=matrix/hello%20world"
결과적으로 이런 URI가 되야 한다.java.net.URI를 이용해 이런 상대경로를 만들수가 없다.
new URI("a:b;param=matrix/hello world");
new URI(null, null, "a:b;param=matrix/hello world", null);
new URI(null, null, "a:b;param=matrix/hello world", null);
왜냐하면, 들어가선 안될 문자가 있다. "hello world"안에 공백이 있어서 invalid한 URI가 된다.
baseUri.toString() + '/' + "a:b;param=matrix/hello world"
그다음 문제로는 java.net.URI는 "a:"를 스키마로 추정해서, 이렇게 해줘야한다.
uri = baseUri.resolve(
new URI(null, null, "/a:b;param=matrix/hello world", null);
new URI(null, null, "/a:b;param=matrix/hello world", null);
이러저러한 처리를 해주고 나면 java.net.URI를 쓴 결과는...
URI u = new URI(base.getScheme(),
base.getUserInfo(), base.getHost(), base.getPort(),
base.getPath() + "/a:b;param=matrix/hello world",
base.getQuery(), base.getScheme());
base.getUserInfo(), base.getHost(), base.getPort(),
base.getPath() + "/a:b;param=matrix/hello world",
base.getQuery(), base.getScheme());
이렇게 된다.. 아..ㅠㅠ
이래서!! JAX-RS에선 UriBuilder를 제공한다. URI를 좀더 심플하고 간단하게 만들기 위해서..
UriBuilder를 이용하면,
UriBuilder.fromUri(baseUri).
path("a:b;param=matrix/hello world").build();
path("a:b;param=matrix/hello world").build();
아니면, 좀 더 명시적으로 지정해주려면
UriBuilder.fromUri(baseUri).
path("a:b").
matrixParam("param", "matrix").
path("hello world").build();
path("a:b").
matrixParam("param", "matrix").
path("hello world").build();
또한 UriBuilder는 URI templates도 제공한다.
UriBuilder.fromUri(baseUri).
path("a:{p1}").
matrixParam("param", "{p2}").
path("hello {p3}").build("b", "matrix", "world");
path("a:{p1}").
matrixParam("param", "{p2}").
path("hello {p3}").build("b", "matrix", "world");
UriInfo와 UriBuilder를 이용해서 URI만드는 예
@Path("/users/")
public class UsersResource {
@Context UriInfo uriInfo;
...
@GET
@Produces("application/json")
public JSONArray getUsersAsJsonArray() {
JSONArray uriArray = new JSONArray();
for (UserEntity userEntity : getUsers()) {
UriBuilder ub = uriInfo.getAbsolutePathBuilder();
URI userUri = ub.
path(userEntity.getUserid()).
build();
uriArray.put(userUri.toASCIIString());
}
return uriArray;
}
}
참고
Building URIs
Jersey 1.0.3 User Guide 중 1.7. Building URIS
UriBuilder API
반응형