web-dev-qa-db-fra.com

Spring RestTemplate postForObject avec Header: webservice ne peut pas trouver mes paramètres d'en-tête

Je me bats avec RestTemplate. Je dois POST quelques informations d'authentification à un service Web de repos. Je peux envoyer une demande et j'obtiens une réponse. Mais selon la réponse, mes paramètres d'en-tête ne passent pas. (Envoi de la même demande avec SOAPUI fonctionne très bien)

Voici mon code:

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

Quelqu'un qui peut me dire ce qui ne va pas avec mon HttpEntity ou HttpHeader?

je vous remercie.

RESOLU:

Ok, enfin ça a fonctionné.

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

Parce que j'ai également eu du mal à répondre, cela peut peut-être être utile aux autres:

@JsonIgnoreProperties(ignoreUnknown = true)
public class ItcLoginResponse {

    public String loginToken;

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

    public void setLoginToken(String loginToken) {
        this.loginToken = loginToken;
    }
}
30
POL

Vous définissez un en-tête indiquant que vous publiez un formulaire (APPLICATION_FORM_URLENCODED), mais définissez ensuite companyId et le mot de passe comme en-têtes HTTP.

Je suppose que vous souhaitez que ces champs figurent dans le corps de votre demande.

Vous créez également un HttpEntity<String> qui indique que vous allez publier un corps de demande contenant une chaîne, mais que vous fournissez des en-têtes mais pas de chaîne.

Si cela ne vous aide pas à le résoudre, vous pouvez peut-être expliquer à quoi la demande est censée ressembler.

6
MattR