RestTemplate无法与APPLICATION_FORM_URLENCODED和请求Pojo一起使用

时间:2017-03-29 20:34:13

标签: java resttemplate media-type

我正在使用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的一个对象,只有一个字符串字段coderestTemplatejackson2HttpMessageConverter中有FormHttpMessageConvertermessageConverters

我收到以下异常:

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方法?

1 个答案:

答案 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(这是默认行为)。