为什么Jersey的UriBuilder.build方法编码#'和%',但不是/?

时间:2011-06-09 02:48:46

标签: rest jersey urlencode jax-rs

我有一个非常典型的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

我认为它编码#%而不是/似乎不一致,但我怀疑它有一个我没有看到的充分理由。所以我的问题是:

  1. 如何让UriBuilder给我.../string%2Fwith%2Fslashes,这是导致泽西岛调用getCustomerid等于string/with/slashes的URI? 编辑:我发现了解决此问题的方法:builder.buildFromEncoded(URLEncoder.encode(id))。但是,这个问题仍未解决,希望得到第二部分的答案......
  2. 更一般地说,UriBuilder.build为什么编码某些特殊字符,而不编码其他字符?
  3. 我找到了How do I encode URI parameter values?,其中接受的答案是“使用UriBuilder”。好吧,我正在使用它,但显然我使用不正确。

1 个答案:

答案 0 :(得分:4)

这似乎是一个确定的问题:

http://java.net/jira/browse/JAX_RS_SPEC-70

您的解决方法听起来不错。