Неправильный запрос 400 для Spring RestTemplate и GET на связанных приложениях Salesforce.com
Возникла проблема с созданием базового API для запросов объекта Salesforce.com с использованием Connected Apps и клиента Spring RestTemplate. Начальный этап аутентификации с использованием операции POST работает нормально и возвращает URL-адрес экземпляра Salesforce, а также требуемый токен доступа. Следующая операция GET завершается неудачно с ошибкой 400. URL-адрес и маркер доступа были проверены плагином Chrome POSTMAN, который в сочетании возвращает действительный ответ JSON.
Стоит также упомянуть, что традиционная реализация не сработала хорошо, и что setAccept была более поздней попыткой решить синтаксический анализ медиатипа.
Ниже код по ошибке:
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.parseMediaType("application/json")));
headers.add("User-Agent", USER_AGENT);
headers.add("Authorization", "Bearer " + accessToken);
HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<String> responseBodyForGet = restRetrieveSalesforceData
.exchange(url, HttpMethod.GET, request, String.class);
Решение, найденное для исправления ошибки 400 при операции Spring RestTemplate GET, заключается в следующем:
URI targetUrl = UriComponentsBuilder.fromUriString(url).build().toUri();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + accessToken);
HttpEntity<String> request = new HttpEntity<String>(headers);
logger.info("Requesting GET from: " + url);
ResponseEntity<String> responseBodyForGet = restRetrieveSalesforceData.exchange(targetUrl,
HttpMethod.GET, request, String.class);
1 ответ
Я добавил решение в отчет, размещенный выше. Обратите внимание на использование первого оператора UriComponentsBuilder, который решил проблему 400 в GET.