Почему метод Джерси UriBuilder.build кодирует # и%, а не /? - PullRequest
12 голосов
/ 09 июня 2011

У меня есть REST API, который довольно типичен, за исключением того, что идентификаторы ресурсов - это не целые числа, а строки, которые часто содержат / символов.Таким образом, если идентификатор клиента равен string/with/slashes, тогда URI для этого клиента должен быть http://localhost/customers/string%2Fwith%2Fslashes.Возвращая список клиентов, я хочу создать этот URI с UriBuilder , чтобы я мог поместить его в список элементов ссылок в стиле ATOM.Но это не совсем работает;Вот небольшой тестовый класс, который показывает, что я имею в виду:

@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, то есть URI, который заставляет Джерси звонить getCustomer с id равным string/with/slashes? edit : Я нашел способ решить эту проблему: builder.buildFromEncoded(URLEncoder.encode(id)).Оставьте этот вопрос открытым, хотя, в надежде получить ответ на вторую часть ...
  2. В общем, почему UriBuilder.build кодирует некоторые специальные символы, но не другие?

Я нашел Как мне кодировать значения параметров URI? , где принятый ответ говорит: «Использовать UriBuilder».Хорошо, я использую это, но очевидно я использую это неправильно.

1 Ответ

4 голосов
/ 01 сентября 2011

Кажется, это подтвержденная проблема:

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

Ваш обходной путь звучит хорошо.

...