I have a REST API which is fairly typical, except that the id's of resources are not integers, but strings, which often contain /
characters. So if a customer's id is string/with/slashes
then the URI for that customer should be http://localhost/customers/string%2Fwith%2Fslashes
. When returning a list of customers, I want to construct that URI with a UriBuilder so I can put it in the href of ATOM-style link elements. But it doesn't quite work; here's a small test class that shows what I mean:
@Path("/customers")
public class JerseyTest {
@Path("{id}")
public Customer getCustomer(@PathParam("{id}") String id) {
return null;
}
public static void main(String[] args) {
buildURI("string#with#hashes"); // => http://localhost/customers/string%23with%23hashes
buildURI("string/with/slashes"); // => http://localhost/customers/string/with/slashes
}
public static void buildURI(String id) {
UriBuilder builder = UriBuilder.fromUri("http://localhost");
builder.path(JerseyTest.class).path(JerseyTest.class, "getCustomer");
URI uri = builder.build(id);
System.out.println(uri);
}
}
The #
's get encoded as I would expect but the /
's don't. I tried using builder.build(URLEncoder.encode(id))
instead, but then the UriBuilder encodes the %
's so you get .../string%252Fwith%252Fslashes
!
It seems inconsistent to me that it encodes #
and %
but not /
, but I suspect there is a good reason for it which I am not seeing. So my question is:
.../string%2Fwith%2Fslashes
, which is the URI that causes Jersey to call getCustomer
with id
equal to string/with/slashes
? edit: I discovered a way to solve this: builder.buildFromEncoded(URLEncoder.encode(id))
. Leaving this question open though, in hopes of getting an answer to the second part...UriBuilder.build
encode some special characters, but not others?I found How do I encode URI parameter values?, where the accepted answer says "Use UriBuilder." Well, I am using it, but apparently I'm using it incorrectly.
This seem to be a confirmed issue:
http://java.net/jira/browse/JAX_RS_SPEC-70
Your workaround sounds good.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With