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