카테고리 없음

[Jersey] Building URIs

버리야 2009. 7. 24. 10:57
반응형
REST의 중요한 점 중의하나가 URIs이다.
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);


왜냐하면, 들어가선 안될 문자가 있다. "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);


이러저러한 처리를 해주고 나면 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());


이렇게 된다.. 아..ㅠㅠ

이래서!! JAX-RS에선 UriBuilder를 제공한다.  URI를 좀더 심플하고 간단하게 만들기 위해서..

UriBuilder를 이용하면,

UriBuilder.fromUri(baseUri).
    path("a:b;param=matrix/hello world").build();


아니면, 좀 더 명시적으로 지정해주려면

UriBuilder.fromUri(baseUri).
    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");



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



 
반응형