137 votes

Obtenir HTTP avec des en-têtes en utilisant RestTemplate

Comment puis-je envoyer une requête GET en utilisant le Spring RestTemplate ? D'autres questions ont utilisé POST, mais j'ai besoin d'utiliser GET. Lorsque je l'exécute, le programme continue de fonctionner, mais il semble que le réseau soit encombré car il se trouve dans une AsyncTask, et lorsque j'essaie d'exécuter une autre asynctask après avoir cliqué sur le bouton de celle-ci, elle ne fonctionne pas.

J'ai essayé de faire

String url = "https://api.blah.com/2.0/search/cubes?w=jdfkl&whitespace=1";

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("Bearer", accessToken);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //copied this from somewhere else, not sure what its for

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

HttpMessageConverter<String> stringConverter = new StringHttpMessageConverter();
FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
List<HttpMessageConverter<?>> msgConverters = new ArrayList<HttpMessageConverter<?>>();

msgConverters.add(formConverter);
msgConverters.add(new MappingJacksonHttpMessageConverter());
msgConverters.add(stringConverter); 

template.setMessageConverters(msgConverters);
//SetSearchResponseData is my custom class to store the incoming JSON
ResponseEntity<SetSearchResponseData> result = template.exchange(url, HttpMethod.GET, request, SetSearchResponseData.class);
//If I was using post, i could have done SetSearchResponseDataresponse = restTemplate.postForObject(url, request, SetSearchResponseData.class);

313voto

Richard Neish Points 891

Le modèle RestTemplate getForObject() ne permet pas de définir des en-têtes. La solution consiste à utiliser la méthode exchange() método.

Ainsi, au lieu de restTemplate.getForObject(url, String.class, param) (qui n'a pas d'en-tête), utilisez

HttpHeaders headers = new HttpHeaders();
headers.set("Header", "value");
headers.set("Other-Header", "othervalue");
...

HttpEntity<Void> requestEntity = new HttpEntity<>(headers);

ResponseEntity<String> response = restTemplate.exchange(
    url, HttpMethod.GET, requestEntity, String.class, param);

Enfin, utilisez response.getBody() pour obtenir votre résultat.

Cette question est similaire à cette question .

8voto

nicholas.hauschild Points 21796

Jetez un coup d'œil à la JavaDoc pour RestTemplate .

Il y a le correspondant getForObject qui sont les équivalents de HTTP GET de postForObject mais ils ne semblent pas répondre à votre exigence de "GET avec en-têtes", car il n'y a aucun moyen de spécifier des en-têtes sur aucun des appels.

En regardant la JavaDoc, aucune méthode spécifique à HTTP GET ne vous permet de fournir également des informations d'en-tête. Il existe cependant des alternatives, dont une que vous avez trouvée et que vous utilisez. L'adresse exchange vous permettent de fournir un HttpEntity objet représentant les détails de la demande (y compris les en-têtes). Le site execute vous permettent de spécifier une RequestCallback à partir duquel vous pouvez ajouter les en-têtes lors de son invocation.

2voto

anand krish Points 2304

La méthode getForObject() de RestTemplate ne prend pas en charge la définition des en-têtes. Vous pouvez utiliser la méthode suivante

syntax :

restTemplate.exchange(url endpoint, HttpMethod.GET,entity, params)

public List<Employee> getListofEmployee()
 {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>(headers);
    ResponseEntity<List<Employee>> response = restTemplate.exchange("http://hello-server/rest/employees",
    HttpMethod.GET,entity, new ParameterizedTypeReference<List<Employee>>() {});
    return response.getBody(); //this returns List of Employee 
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X