Spring RestTemplate для запроса POST с пользовательскими заголовками и объектом запроса

В Spring RestTemplate существует способ отправки пользовательских заголовков вместе с объектом запроса POST. Я уже опробовал метод exchange, который доступен. Кажется, что мы можем отправлять пары ключевых значений вместе с пользовательскими заголовками, но не сам объект запроса, прикрепленный к HttpEntity.. Следующий код иллюстрирует попытку и, как представляется, 400 BadRequest для сервера.

    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<?> httpEntity = new HttpEntity<Object>(requestDTO, requestHeaders);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.exchange(URL, HttpMethod.POST, httpEntity, SomeObject.class);

Кто-нибудь знает об этой ситуации? Или это то, что невозможно, что я пытаюсь сделать?

Ответ 1

Да, возможно, если использовать заголовки MultiValueMap вместо HttpHeaders

Пример:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Authorization", "Basic " + base64Creds);
headers.add("Content-Type", "application/json");

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

HttpEntity<ObjectToPass> request = new HttpEntity<ObjectToPass>(objectToPassInstance, headers);

restTemplate.postForObject(urlPost, request, Boolean.class);

Boolean.class только потому, что мой контроллер возвращает boolean в этой конечной точке (может быть что угодно)

Удачи в кодировании!

Ответ 2

  • Попробуйте включить полный отладочный пакет Spring. Я уверен, что вы получите больше информацию о вашем "400 Bad Request":

    <logger name="org.springframework">
        <level value="DEBUG"/>
    </logger>
    
  • Попробуйте отправить тот же запрос с помощью любых инструментов для отдыха (например, Rest Console Chrome).

  • Посмотрите, что происходит на консоли отладки браузера (например, вкладка "Сеть" для Chrome).

Эти шаги всегда помогают мне.

Ответ 3

Если вы используете HttpClient 3.x, включите ведение журнала, следуя this. Если вы используете HttpClient 4.x, включите ведение журнала, следуя this. Это должно сказать вам, что нужно отправлять по проводам, и быть достойной отправной точкой для отладки.