2013-10-09 621 views
4

我想消费这样一个服务:RestTemplate.postForObject - 错误:org.springframework.web.client.HttpClientErrorException:400错误的请求

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; 
    } 
} 

但是当我运行它,我得到这个错误:

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) 
+0

,你能否告诉我们这个请求您的REST API? –

+0

我正在使用第三方API –

+0

并且该API在您提出的请求中期望什么。你没有发送它所期望的。 –

回答

1

我想你是缺少标题和正确的请求正文。试试这个,

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); 
    } 
+2

我仍然收到相同的错误 –

+0

我添加了内容类型。你可以再试一次吗? – nilesh

2

尝试这些修改您的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; 
}