Неправильный запрос 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.

Другие вопросы по тегам