Как передать пару ключевых значений с помощью resttemplate в java
Мне нужно передать пару ключевых значений в тело почтового запроса. Но когда я запускаю свой код, я получаю сообщение об ошибке "Не могу написать запрос: не найдено подходящего HttpMessageConverter для типа запроса [org.springframework.util.LinkedMultiValueMap] и типа содержимого [text/plain]"
Мой код выглядит следующим образом:
MultiValueMap<String, String> bodyMap = new LinkedMultiValueMap<String, String>();
bodyMap.add(GiftangoRewardProviderConstants.GIFTANGO_SOLUTION_ID, giftango_solution_id);
bodyMap.add(GiftangoRewardProviderConstants.SECURITY_TOKEN, security_token);
bodyMap.add(GiftangoRewardProviderConstants.REQUEST_TYPE, request_type);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(bodyMap, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> model = restTemplate.exchange(giftango_us_url, HttpMethod.POST, request, String.class);
String response = model.getBody();
Ответы
Ответ 1
FormHttpMessageConverter
используется для преобразования объектов MultiValueMap
для отправки в HTTP-запросах. По умолчанию для этого преобразователя используются типы application/x-www-form-urlencoded
и multipart/form-data
. Указав тип содержимого как text/plain
, вы сообщаете RestTemplate использовать StringHttpMessageConverter
headers.setContentType(MediaType.TEXT_PLAIN);
Но этот конвертер не поддерживает преобразование MultiValueMap
, поэтому вы получаете ошибку. У вас есть несколько вариантов. Вы можете изменить тип контента на application/x-www-form-urlencoded
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
Или вы НЕ можете установить тип содержимого и позволить RestTemplate обрабатывать его для вас. Он будет определять это на основе объекта, который вы пытаетесь преобразовать. В качестве альтернативы попробуйте использовать следующий запрос.
ResponseEntity<String> model = restTemplate.postForEntity(giftango_us_url, bodyMap, String.class);