Подтвердить что ты не робот

Почему метод кодирования Джерси UriBuilder.build # и%, но не/?

У меня есть REST API, который довольно типичен, за исключением того, что идентификатор ресурсов не является целым числом, а строками, которые часто содержат символы /. Поэтому, если идентификатор клиента string/with/slashes, тогда URI для этого клиента должен быть http://localhost/customers/string%2Fwith%2Fslashes. Когда вы возвращаете список клиентов, я хочу построить этот URI с UriBuilder, поэтому я могу поместить его в href из 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!

Мне кажется непоследовательным, что он кодирует # и %, но не /, но я подозреваю, что для этого есть веская причина, которую я не вижу. Поэтому мой вопрос:

  • Как я могу заставить UriBuilder дать мне .../string%2Fwith%2Fslashes, который является URI, который заставляет Джерси называть getCustomer с id равным string/with/slashes? edit. Я нашел способ решить эту проблему: builder.buildFromEncoded(URLEncoder.encode(id)). Если оставить этот вопрос открытым, хотя в надежде получить ответ на вторую часть...
  • В более общем смысле, почему UriBuilder.build кодирует некоторые специальные символы, но не другие?

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

4b9b3361