RestTemplate.postForObject - Error: org.springframework.web.client.HttpClientErrorException: 400 Bad Request

匿名 (未验证) 提交于 2019-12-03 00:53:01

问题:

I'm trying to consume a service in this way:

import java.util.ArrayList; import java.util.List;  import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate;  public class StatesAPI {     private RestTemplate restTemplate;     private String apiEndpoint = "http://service/Geo.svc/getsomethingJson?format=json";      public static void main(String[] args) {         StatesAPI s = new StatesAPI();         s.foo("CA");     }      public void foo(String state) {         String requestBody = "{\"statename\":\"" + state + "\"}";         String apiResponse = getRestTemplate().postForObject(apiEndpoint,                 requestBody, String.class);         System.out.println(apiResponse);     }      public RestTemplate getRestTemplate() {         // TODO: Fix the RestTemplate to be a singleton instance.         restTemplate = (this.restTemplate == null) ? new RestTemplate()                 : restTemplate;         HttpMessageConverter<?> formHttpMessageConverter = new FormHttpMessageConverter();         HttpMessageConverter<?> stringHttpMessageConverternew = new StringHttpMessageConverter();         List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();         converters.add(formHttpMessageConverter);         converters.add(stringHttpMessageConverternew);         restTemplate.setMessageConverters(converters);         return restTemplate;     }      public void setRestTemplate(RestTemplate restTemplate) {         this.restTemplate = restTemplate;     } } 

but when I run it I got this error:

09/10/2013 10:10:32 AM org.springframework.web.client.RestTemplate handleResponseError ADVERTENCIA: POST request for "[here the link in the code]" resulted in 400 (Bad Request); invoking error handler Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 400 Bad Request     at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:76)     at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:486)     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:443)     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)     at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:279)     at StatesAPI.foo(StatesAPI.java:20)     at StatesAPI.main(StatesAPI.java:15) 

回答1:

Try these modifications to your getRestTemplate:

public RestTemplate getRestTemplate() {     // TODO: Fix the RestTemplate to be a singleton instance.     restTemplate = (this.restTemplate == null) ? new RestTemplate() : restTemplate;      // Set the request factory.      // IMPORTANT: This section I had to add for POST request. Not needed for GET     restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());      // Add converters     // Note I use the Jackson Converter, I removed the http form converter      // because it is not needed when posting String, used for multipart forms.     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());      return restTemplate; } 


回答2:

I think you are missing headers and proper request body. Try this,

    public void foo(String state) {         MultiValueMap<String, Object> headers = new LinkedMultiValueMap<String, Object>();         headers.add("Accept", "application/json");         headers.add("Content-Type", "application/json");         String requestBody = "{\"statename\":\"" + state + "\"}";         HttpEntity request = new HttpEntity(requestBody, headers);             String apiResponse = getRestTemplate().postForObject(apiEndpoint,                     request, String.class);             System.out.println(apiResponse);      } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!