2013-10-09 2 views
4

Я пытаюсь использовать службу следующим образом:RestTemplate.postForObject - Ошибка: org.springframework.web.client.HttpClientErrorException: 400 Bad Request

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