我正在使用restTemplate来使用服务。
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity request = new HttpEntity(countryRequest, headers);
CountryResponse response = restTemplate.postForObject(countryURL, request, CountryResponse.class);
countryRequest
是POJO的一个对象,只有一个字符串字段code
。
restTemplate
在jackson2HttpMessageConverter
中有FormHttpMessageConverter
和messageConverters
。
我收到以下异常:
org.springframework.web.client.RestClientException:
Could not write request: no suitable HttpMessageConverter found for request type [CountryRequest] and content type [application/x-www-form-urlencoded]
但如果我使用MultiValueMap
代替CountryRequest
,我会得到200回复:
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add(code, "usa");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity(map, headers);
有没有办法在这里替换MultiValueMap
方法?
答案 0 :(得分:0)
请求序列化主要有两种:通常的FORM数据或JSON对象。 表单数据是最简单和最旧的方式,它在POST有效负载中发送简单的键值对字符串。但是当你需要发送一些带有嵌套属性或某些列表或甚至是map的对象时,它就成了一个问题。 这就是为什么每个人都试图使用JSON格式,这种格式可以更容易地反序列化为POJO对象。这是现代网络的事实标准。
因此,出于某些原因RestTemplate
尝试序列化CountryRequest
,但它不知道如何将其序列化为FORM数据。
尝试将request
替换为您要发送的pojo:
CountryRequest request = new CountryRequest();
CountryResponse response = restTemplate.postForObject(countryURL, request, CountryResponse.class);
然后RestTemplate尝试将CountryRequest
序列化为JSON(这是默认行为)。