Экранирование символа `%` в параметре запроса в JAX-RS - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь отправить запрос GET с некоторой строкой URL в качестве параметра, используя любой из Джерси или Resteasy

Response response = new ResteasyClientBuilder()
        .build()
        .target(UriBuilder.fromPath("https://foo.bar"))
        .queryParam("url", "http://hostname.com/The%20URL%20with spaces.jpg")
        .request()
        .get();

Обе реализации отправляют
https://foo.bar?url=http%3A%2F%2Fhostname.com%2FThe%20URL%20with%20spaces.jpg

Я предполагаю, что исходное пространство экранируется с помощью %20, а оригинальное %20 дважды экранируется в параметре запроса.
Но это не так.
Исходное пространство и %20 смешиваются, и на стороне сервера я получаю неэкранированную строку со всеми %20, преобразованными в пробелы, и строка разбивается.

Согласно исходному коду Resteasy , он «сохраняет закодированные значения«% ... »и параметры шаблона без изменений». Но я не нашел ни одного слова в документации JEE об этом поведении.

Должен ли я экранировать свою строку перед добавлением ее в качестве параметра?
Какой символ экранирования я должен использовать, чтобы быть уверенным, что он экранирует все значения "%..." and template parameters, и когда он выходит за пределы параметра, он успешно экранируется сервером?

1 Ответ

0 голосов
/ 05 сентября 2018

Решение для стандарта JAX-RS WebTarget состоит в том, чтобы не применять параметры напрямую, а применять их как параметры шаблона.

Response response = new ResteasyClientBuilder()
        .build()
        .target(UriBuilder.fromPath("https://foo.bar"))
        .queryParam("url", "{urlTemplate}")
        .resolveTemplate("urlTemplate", "http://hostname.com/The%20URL%20with spaces.jpg")
        .request()
        .get();

Сначала мы добавляем шаблон {urlTemplate} в качестве значения параметра, а затем визуализируем этот шаблон с реальным значением.
WebTarget всегда предполагает, что данный параметр является возможным шаблоном, и не экранирует некоторые символы
Но .resolveTemplate() гарантирует экранирование всех символов, которые должны быть экранированы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...