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

У меня есть REST API, который довольно типичен, за исключением того, что идентификаторы ресурсов не целые числа, а строки, которые часто содержат / символов. Итак, если идентификатор клиента - строка / с / косой чертой , тогда 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 !

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

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

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

12
задан Community 23 May 2017 в 12:34
поделиться