2012-07-20 12 views
30

Sono in difficoltà con RestTemplate. Ho bisogno di pubblicare alcune informazioni di autenticazione su un servizio web di resto. Posso inviare una richiesta e ottengo una risposta. Ma secondo la risposta, i miei parametri di intestazione non sono passati. (Invio la stessa richiesta con SoapUI funziona bene)Spring RestTemplate postForObject con intestazione: webservice non riesce a trovare i miei parametri di intestazione

Questo è il mio codice:

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

Chi mi può dire cosa c'è di sbagliato con il mio HttpEntity o HttpHeader?

grazie.

risolto:

Ok, finalmente capito di lavoro.

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

Perché ho anche avuto un momento difficile sulla risposta, forse può essere utile per gli altri:

@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

Aggiornamento: uso 'MappingJackson2HttpMessageConverter' al posto del vecchio 'MappingJacksonHttpMessageConverter' – Udo

+0

Sembra che l'istanza messageConverters non sia utilizzata nella soluzione ?! –

risposta

5

Si sta impostando un colpo di testa che indica che stai inviando un modulo (APPLICATION_FORM_URLENCODED), ma poi imposta companyId e password come header HTTP.

Sospetto che vogliate che quei campi siano nel corpo della vostra richiesta.

Stai anche creando un HttpEntity<String> che indica che stai per pubblicare un corpo di richiesta contenente una stringa, ma stai fornendo intestazioni ma nessuna stringa.

Se ciò non aiuta a risolverlo, forse è possibile spiegare come dovrebbe apparire la richiesta.

-1

È possibile impostare il valore di intestazione come Autorizzazione

// imposta il nome utente e la password per la creazione di una richiesta di base Auth

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

Quale versione di 'HttpHeaders' stai usando? Il mio non ha un metodo 'setAuthorization (..)'. – Abdull

+0

La domanda riguarda la chiamata post non ricevere la chiamata – user2531799

Problemi correlati