web-dev-qa-db-fra.com

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

Comment puis-je envoyer une demande GET à l'aide de Spring RestTemplate? D'autres questions ont utilisé POST, mais je dois utiliser GET. Lorsque j'exécute ce programme, le programme continue de fonctionner, mais il semble que le réseau soit bouché, car il s'agit d'une tâche asynchrone. Lorsque j'essaie d'exécuter un autre asynctask après avoir cliqué sur le bouton correspondant, cela 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);
48
rasen58

La méthode RestTemplate getForObject() ne prend pas en charge la définition des en-têtes. La solution consiste à utiliser la méthode exchange() .

Donc, 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 entity = new HttpEntity(headers);

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

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

Cette question est similaire à cette question .

118
Richard Neish

Jetez un coup d'œil au JavaDoc for RestTemplate .

Il existe les méthodes getForObject correspondantes qui sont les équivalents HTTP GET de postForObject, mais elles ne semblent pas répondre à vos exigences de "GET avec en-têtes", comme il n'y a aucun moyen de spécifier des en-têtes sur les appels.

En ce qui concerne JavaDoc, aucune méthode spécifique à HTTP GET ne vous permet également de fournir des informations d’en-tête. Il existe cependant des alternatives, que vous avez trouvées et que vous utilisez. Les méthodes exchange vous permettent de fournir un objet HttpEntity représentant les détails de la demande (y compris les en-têtes). Les méthodes execute vous permettent de spécifier un RequestCallback à partir duquel vous pouvez ajouter les en-têtes lors de son invocation.

3