Вызов SAP OData с Reactive WebClient - экранирование "/" - PullRequest
1 голос
/ 25 октября 2019

В настоящее время я занимаюсь разработкой интеграции с SAP с использованием сервиса OData. Мое клиентское приложение основано на JAVA 8 Spring.

Проблема:

Из моего клиентского приложения, когда я выполняю GET с использованием пружинного реактивного веб-клиента - SAP не можетобработать запрос. Но когда я использую тот же URL в клиенте Firefox-REST, я получаю правильный ответ. Это происходит только тогда, когда у нас есть "/" в некоторых значениях URL.

Вот мой URL.

http://host:port/sap/opu/odata/sap/Service/Set(RUNTYPE='TEST',DATA='/ON/CLOUD')/?sap-client=XXX&spnego=disabled

Поле DATA = '/ ON/ CLOUD 'вызывает проблемы здесь. (Обратите внимание, что когда я не использую "/", все работает просто отлично)

Я попробовал это, вручную экранировав "/": - это нормально работает от клиента REST http://host:port/sap/opu/odata/sap/Service/Set(RUNTYPE='TEST',DATA='%2FON%2FCLOUD')/?sap-client=XXX&spnego=disabled

Но когда я получаю GET от моего клиента Java с указанным выше URL-адресом, SAP жалуется на неправильный URL-адрес. Когда я проверил журналы в SAP, по какой-то причине моя клиентская программа выполняла вызов GET с нижеуказанным URL http://host:port/sap/opu/odata/sap/Service/Set(RUNTYPE='TEST',DATA='%252FON%252FCLOUD')/?sap-client=XXX&spnego=disabled

Так что «% 2FON% 2FCLOUD» преобразуется в «% 252FON% 252FCLOUD» в вызове GET.

Я хотел бы экранировать "%" и использовать URL, что бы я ни отправил. Не могли бы вы помочь мне, где я могу это исправить?

Вот код, который я использую в данный момент.

url - мой URL

{
        Mono<String> mono;
            mono = webClient().get()
                    .uri(url)
                    .accept(MediaType.APPLICATION_JSON)
                    .exchange()
                    .doOnError(e -> { throw new HttpException("Error executing GET request", e); } )
                    .doOnSuccess(onSuccess -> res = onSuccess)
                    .flatMap(clientResponse -> clientResponse.bodyToMono(String.class));
        String body = mono.block();
        log.debug("Response object: {}", res);
        log.info("Get returned: {}", body);
        checkClientResponseCode(res, HttpStatus.OK, body);
        return body;

}

Большое спасибо за вашу помощь.

Дополнительная информация:

Вот http-трассировка клиента JAVA:

GET sap / opu / odata / sap/ Service / Set (RUNTYPE = 'TEST', DATA = '% 25F2ON% 25F2CLOUD') /? Sap-client = XXX & spnego = отключенный пользовательский агент: ReactorNetty / 0.7.15.RELEASE Хост: имя хоста: порт принимает кодировку: gzipПринять: application / json Авторизация: Basic AuthorizationKey ==

Я отправляю нижеприведенный URL-адрес в Spring WebClient sap / opu / odata / sap / Service / Set (RUNTYPE = 'TEST', DATA = '% 2F2ON%2F2CLOUD ') /? Sap-client = XXX & spnego = отключено

Моя весенняя версия: springBootVersion =' 2.0.9.RELEASE '

Моя версия SAP: SAP FPSL Release 753

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

...