POST-запрос с form-data через Spring RestTemplate
Быстрый ответ
Для отправки данных формы методом POST с применением Spring RestTemplate, выполните следующие действия:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("field1", "value1");
formData.add("field2", "value2");
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
ResponseEntity<String> response = restTemplate.postForEntity("http://target-url.com/submit", requestEntity, String.class);
Здесь мы задаем тип содержимого как APPLICATION_FORM_URLENCODED
, упаковываем данные и отправляем запрос.
Пользовательские запросы с применением метода Exchange
Метод exchange придает большую гибкость и контроль над HTTP-запросами:
ResponseEntity<String> response = restTemplate.exchange(
"http://target-url.com/submit",
HttpMethod.POST,
requestEntity,
String.class);
Отправка данных формы multipart/form-data
Если нужно отправить файлы, замените MediaType
и воспользуйтесь MultiValueMap
для формирования тела запроса:
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", new FileSystemResource("/path/to/file"));
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
Важно верно выбрать MediaType
для корректной обработки данных.
Визуализация
Данный процесс схож с отправкой письма:
📮 → 💌 → 📬
- 📮 Подготовка содержимого для отправки (данные формы).
- 💌 Упаковка в "конверт" с адресом (HTTP заголовки).
- 📬 Отправка с помощью RestTemplate.
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("key1", "value1");
formData.add("key2", "value2");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formData, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity("http://api.endpoint.com/post", request, String.class);
🔑 Суть заключается в том, что необходимо правильно упаковать данные и выбрать подходящий формат, а RestTemplate выполнит всё остальное.
Управление ошибками и качественный логгирование
RestTemplate
информирует о возникших ошибках:
HttpClientErrorException
— о проблемах на стороне клиента.HttpServerErrorException
— о ошибках сервера.ResourceAccessException
— о проблемах ввода-вывода.
Моделирование RestTemplate для тестирования
В тестах можно настроить мокирование RestTemplate
:
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
mockServer.expect(ExpectedCount.once(),
requestTo("http://target-url.com/submit"))
.andExpect(method(HttpMethod.POST))
.andRespond(withSuccess("response body", MediaType.APPLICATION_JSON));
Упрощение приведения типов с помощью Generic'ов
Применение Generic'ов может значительно упростить приведение типов:
ResponseEntity<MyResponseType> response = restTemplate.postForEntity(
"http://target-url.com/submit", requestEntity, MyResponseType.class);
Полезные материалы
- Getting Started | Consuming a RESTful Web Service — основы работы с веб-сервисами REST в Spring.
- RestTemplate (Spring Framework 6.1.3 API) — документация по API RestTemplate.
- Spring RestTemplate (с практическими примерами) — пособие с примерами использования.
- Использование RestTemplate в Spring — полезное руководство.
- Управление данными формы с шаблонами — обсуждение на Stackoverflow.