У меня есть 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? изменить: я нашел способ решить эту проблему:builder.buildFromEncoded(URLEncoder.encode(id)). Но оставим этот вопрос открытым в надежде получить ответ на вторую часть ... - В общем, почему
UriBuilder.buildкодирует одни специальные символы, а другие нет?
Я нашел Как мне закодировать значения параметров URI?, где принято ответ гласит: «Используйте UriBuilder». Ну, пользуюсь, но видимо неправильно использую.
buildURI("string\u002fwith\u002fslashes")? - person stand   schedule 09.06.2011URI.toStringизменяет адрес.URI.getPathне надо. Взгляните наcom.sun.jersey.api.uri.UriComponent.encode(s, t), там выполняется преобразование в%7..../являются частью URI, поэтому, возможно, есть способ избежать их. (Я продолжаю копать) - person yves amsellem   schedule 09.06.2011"string\u002fwith\u002fslashes"компилируется в тот же байт-код, что и"string/with/slashes", но попробовать стоит. Итак, я попробовал; такой же выход. Спасибо за идею! - person MatrixFrog   schedule 09.06.2011