java - mkyong - Spring RestTemplate postForObject with Header: webservice no puede encontrar mis parĂ¡metros de encabezado
resttemplate timeout (2)
Está configurando un encabezado que indica que está publicando un formulario (APPLICATION_FORM_URLENCODED), pero luego establece el ID de la empresa y la contraseña como encabezados HTTP.
Sospecho que desea que esos campos estén en el cuerpo de su solicitud.
También está creando una HttpEntity<String>
que indica que va a publicar un cuerpo de solicitud que contiene un String, pero está proporcionando encabezados pero no String.
Si eso no te ayuda a solucionarlo, quizás puedas explicar cómo se verá la solicitud.
Estoy luchando con RestTemplate. Necesito POSTAR alguna información de autenticación a un servicio web de descanso. Puedo enviar una solicitud y recibo una respuesta. Pero de acuerdo con la respuesta, mis parámetros de cabecera no se están transmitiendo. (Enviar la misma solicitud con SOAPUI funciona bien)
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);
¿Alguien que pueda decirme qué está mal con mi HttpEntity o HttpHeader?
gracias.
Resuelto:
Ok, finalmente lo tengo funcionando.
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);
Debido a que también tuve problemas con la respuesta, tal vez pueda ser útil para otros:
@JsonIgnoreProperties(ignoreUnknown = true)
public class ItcLoginResponse {
public String loginToken;
@JsonProperty("token")
public String getLoginToken() {
return loginToken;
}
public void setLoginToken(String loginToken) {
this.loginToken = loginToken;
}
}
Puede establecer el valor del encabezado como Autorización
// Establecer el nombre de usuario y la 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
}