В настоящее время я занимаюсь разработкой интеграции с 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
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.