Отключить экранирование RestTemplate - PullRequest
0 голосов
/ 26 марта 2019

Существующий API, который я должен вызвать, принимает параметр запроса в форме

?key=001|ABC|123456

Однако RestTemplate, используя свой внутренний UriBuilder, экранирует символ | до %7C.
Таким образом, этот параметр приводит к

?key=001%7CABC%7C123456

Я попытался установить пользовательский UriTemplateHandler через setUriTemplateHandler, используя новый DefaultUriBuilderFactory

final var uriBuilder = new DefaultUriBuilderFactory();

и отключив кодировкуи синтаксический анализ

uriBuilder.setEncodingMode(EncodingMode.NONE);
uriBuilder.setParsePath(false);

, однако при создании URI

URI.create(url)

внутренне возникает другое исключение, говорящее о наличии недопустимого символа, который, очевидно, |.

Как можно полностью отключить это поведение в Spring, используя RestTemplate?
Я не могу использовать экранированные значения.

Выполнение того же вызова через SoapUI с использованием неэкранированного URL-адреса возвращает правильное значениеответ.

1 Ответ

0 голосов
/ 26 марта 2019

Кажется, что нет чистого способа сделать это с классами Spring.
В итоге я выбрал необработанный HttpURLConnection, который, хотя и не так прост в использовании, в любом случае обеспечивает все необходимые функции.

Дело в том, что DefaultUriBuilderFactory, который используется для построения окончательного URI, использует класс java.net.URI, который подчиняется правилам RFC.

private URI createUri(UriComponents uric) {
    if (encodingMode.equals(EncodingMode.URI_COMPONENT)) {
        uric = uric.encode();
    }
    return URI.create(uric.toString());
}

Как видите, даже если вы отключите кодирование с помощью

uriBuilder.setEncodingMode(EncodingMode.NONE);

конечный результат - это всегда вызов URI.create.
Вы не можете избежать этого, если не предоставив пользовательский UriBuilderFactory.

...