web-dev-qa-db-fra.com

Ajouter mon en-tête http personnalisé à la demande/à l'extension RestTemplate de Spring RestTemplate

Mon code actuel:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Mall[] malls = restTemplate.getForObject(url, Mall[].class);

J'ai besoin d'ajouter des en-têtes personnalisés pour ma demande, sous la forme:

X-TP-DeviceID : <GUID>

Quel est le moyen le plus simple de le faire dans mon cas? Existe-t-il un moyen d'ajouter une définition d'en-tête personnalisée à mon objet restTemplate avant d'envoyer la demande au serveur?

[modifier]

Est-ce correct?

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

    HttpHeaders headers = new HttpHeaders();
    headers.set("X-TP-DeviceID", "1234567890");
    HttpEntity entity = new HttpEntity(headers);

    HttpEntity<Mall[]> response = restTemplate.exchange(url, HttpMethod.GET, entity, Mall[].class);

    Mall[] malls = response.getBody();

[ajoutée]

Donc, j'ai réussi à le faire fonctionner. Cependant, je ne suis pas entièrement satisfait de cela. Dans mon cas, il me faudra fournir les mêmes en-têtes personnalisés pour tous les appels que je passe. 

Ma prochaine question est donc la suivante: est-il possible de définir automatiquement les en-têtes personnalisés à ajouter à chaque appel web-service, par exemple en étendant la classe RestTemplate et en y mettant tous les en-têtes personnalisés? Ensuite, tout ce que je devrais faire serait simplement d’utiliser ma variable RestTemplate personnalisée au lieu de celle stock, et tous mes en-têtes personnalisés y seraient présents par défaut.

16
user1209216

Vous pouvez transmettre des en-têtes http personnalisés avec la méthode d’échange RestTemplate comme indiqué ci-dessous.

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON }));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-TP-DeviceID", "your value");

HttpEntity<RestRequest> entityReq = new HttpEntity<RestRequest>(request, headers);

RestTemplate template = new RestTemplate();

ResponseEntity<RestResponse> respEntity = template
    .exchange("RestSvcUrl", HttpMethod.POST, entityReq, RestResponse.class);

EDIT: Ci-dessous le code mis à jour. Ce lien propose plusieurs moyens d'appeler le service repos avec des exemples

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-TP-DeviceID", "your value");

HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<Mall[]> respEntity = restTemplate.exchange(url, HttpMethod.POST, entity, Mall[].class);

Mall[] resp = respEntity.getBody();
22
kswaughs

Ajoutez un en-tête "User-Agent" à votre demande. 

Certains serveurs tentent d'empêcher les programmes spidering et les scrapers d'accéder à leur serveur car auparavant, les demandes n'envoyaient pas d'en-tête d'agent d'utilisateur. 

Vous pouvez essayer de définir une valeur d'agent utilisateur personnalisée ou utiliser une valeur identifiant un navigateur tel que "Mozilla/5.0 Firefox/26.0".

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();

    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.add("user-agent", "Mozilla/5.0 Firefox/26.0");
    headers.set("user-key", "your-password-123"); // optional - in case you auth in headers
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    ResponseEntity<Game[]> respEntity = restTemplate.exchange(url, HttpMethod.GET, entity, Game[].class);

    logger.info(respEntity.toString());
0
Sean Gildea