我有一个非常典型的REST API,除了资源的id不是整数,而是字符串,通常包含/
个字符。因此,如果客户的ID为string/with/slashes
,则该客户的URI应为http://localhost/customers/string%2Fwith%2Fslashes
。返回客户列表时,我想用UriBuilder构造该URI,以便将其放在ATOM样式链接元素的href中。但它不太有效;这是一个小测试类,显示了我的意思:
@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);
}
}
#
按照我的预期进行编码,但/
没有。我尝试使用builder.build(URLEncoder.encode(id))
,但随后UriBuilder会对%
进行编码,以便您获得.../string%252Fwith%252Fslashes
!
我认为它编码#
和%
而不是/
似乎不一致,但我怀疑它有一个我没有看到的充分理由。所以我的问题是:
.../string%2Fwith%2Fslashes
,这是导致泽西岛调用getCustomer
且id
等于string/with/slashes
的URI? 编辑:我发现了解决此问题的方法:builder.buildFromEncoded(URLEncoder.encode(id))
。但是,这个问题仍未解决,希望得到第二部分的答案...... UriBuilder.build
为什么编码某些特殊字符,而不编码其他字符?我找到了How do I encode URI parameter values?,其中接受的答案是“使用UriBuilder”。好吧,我正在使用它,但显然我使用不正确。