2012-07-20 35 views
30

Estoy luchando con RestTemplate. Necesito enviar cierta información de autenticación a un servicio web de descanso. Puedo enviar una solicitud y recibir una respuesta. Pero según la respuesta, mis parámetros de encabezado no están llegando. (Envío de la misma petición con SOAPUI funciona bien)Spring RestTemplate postForObject with Header: webservice no puede encontrar mis parámetros de encabezado

Este es mi código:

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
headers.add("companyId", companyId); 
headers.add("password", password);    

HttpEntity<String> request = new HttpEntity<String>(headers); 

RestTemplate restTemplate = new RestTemplate(); 

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
messageConverters.add(new MappingJacksonHttpMessageConverter());   
restTemplate.setMessageConverters(messageConverters); 

LoginResponse response = (LoginResponse)restTemplate.postForObject(url, request, LoginResponse.class); 

Quien me puede decir lo que está mal con mi HttpEntity o HTTPHeader?

gracias.

resuelto:

Ok, finalmente, tengo trabajo.

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
map.add("companyId", companyId); 
map.add("password", password); 

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);  

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); 

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
messageConverters.add(new MappingJacksonHttpMessageConverter());  
messageConverters.add(new FormHttpMessageConverter()); 
restTemplate.setMessageConverters(messageConverters); 

LoginResponse response = (LoginResponse) restTemplate.postForObject(url, request, LoginResponse.class); 

porque yo también tenía un tiempo difícil en la respuesta, tal vez puede ser útil a los demás:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ItcLoginResponse { 

    public String loginToken; 

    @JsonProperty("token") 
    public String getLoginToken() { 
     return loginToken; 
    } 

    public void setLoginToken(String loginToken) { 
     this.loginToken = loginToken; 
    } 
} 
+0

Actualización: uso 'MappingJackson2HttpMessageConverter' en lugar de la vieja 'MappingJacksonHttpMessageConverter' – Udo

+0

Parece que la instancia messageConverters no se usa en tu solución? –

Respuesta

5

está configurando una cabecera que indica que está enviando un formulario (APPLICATION_FORM_URLENCODED), pero luego estableciendo companyId y contraseña como encabezados HTTP.

Sospecho que quiere que esos campos estén en el cuerpo de su solicitud.

También está creando un HttpEntity<String> que indica que va a publicar un cuerpo de solicitud que contiene una Cadena, pero está proporcionando encabezados pero no Cadena.

Si eso no te ayuda a solucionarlo quizás puedas explicar cómo se supone que debe ser la solicitud.

-1

Puede establecer el valor de cabecera de Autorización como

// Establecer el nombre de usuario y una contraseña para crear una solicitud de autenticación básica

HttpAuthentication authHeader = new HttpBasicAuthentication(username, password); 
HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.setAuthorization(authHeader); 
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders); 

// Create a new RestTemplate instance 
RestTemplate restTemplate = new RestTemplate(); 

// Add the String message converter 
restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 

try { 

    // Make the HTTP GET request to the Basic Auth protected URL 
    ResponseEntity<Message> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); 

    return response.getBody(); 

} catch (HttpClientErrorException e) { 

    Log.e(TAG, e.getLocalizedMessage(), e); 
    // Handle 401 Unauthorized response 
} 
+3

¿Qué versión de 'HttpHeaders' estás usando? El mío no tiene un método 'setAuthorization (..)'. – Abdull

+0

La pregunta es sobre la llamada posterior no recibir llamada – user2531799

Cuestiones relacionadas