2012-07-20 6 views
30

Mam problemy z RestTemplate. Muszę POST niektóre informacje uwierzytelniające do odpoczynku w serwisie internetowym. Mogę wysłać prośbę i otrzymam odpowiedź. Ale zgodnie z odpowiedzią parametry mojego nagłówka nie są przekazywane. (Wysyłanie tego samego wniosku z SoapUI działa poprawnie)Spring RestTemplate postForObject z nagłówkiem: usługa internetowa nie może znaleźć moich parametrów nagłówka

To jest mój kod:

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

Kto może mi powiedzieć co jest nie tak z moim HttpEntity lub HttpHeader?

dziękuję.

rozwiązany:

Ok, wreszcie dostał pracę.

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

Ponieważ miałem także trudny czas na odpowiedź, może to być przydatne dla innych:

@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

UPDATE: use 'MappingJackson2HttpMessageConverter' zamiast starego 'MappingJacksonHttpMessageConverter' – Udo

+0

Wygląda na to, że wystąpienie messageConverters jest nieużywane w twoim rozwiązaniu?! –

Odpowiedz

5

Ty ustawienie nagłówek wskazujący jesteś zamieszczając formularz (APPLICATION_FORM_URLENCODED) ale następnie ustawienie companyId i password jako nagłówków HTTP.

Podejrzewam, że chcesz, aby te pola znalazły się w treści Twojego żądania.

Tworzysz także HttpEntity<String>, który oznacza, że ​​chcesz opublikować treść żądania zawierającą ciąg, ale zapewniasz nagłówki, ale nie ciąg.

Jeśli to nie pomoże, możesz wyjaśnić, jak ma wyglądać żądanie.

-1

Można ustawić wartość nagłówka jak autoryzacja

// Ustaw nazwę użytkownika i hasło do tworzenia wezwań Podstawowe 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

Którą z wersji 'HttpHeaders' używasz? Mój nie ma metody 'setAuthorization (..)'. – Abdull

+0

Pytanie dotyczy połączenia nieodebranego – user2531799

Powiązane problemy