it-swarm.com.de

HTTP-Get mit Headern mit RestTemplate

Wie kann ich eine GET-Anfrage mit der Spring RestTemplate senden? Andere Fragen haben POST verwendet, aber ich muss GET verwenden. Wenn ich dies ausführe, funktioniert das Programm weiterhin, aber es scheint, dass das Netzwerk verstopft ist, weil es sich um eine AsyncTask handelt. Wenn ich versuche, eine andere AsyncTask auszuführen, nachdem ich auf die Schaltfläche für diese geklickt habe, funktionieren sie nicht.

Ich habe es versucht

        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

Die Methode RestTemplate getForObject() unterstützt das Festlegen von Headern nicht. Die Lösung besteht darin, die Methode exchange() zu verwenden.

Verwenden Sie also anstelle von restTemplate.getForObject(url, String.class, param) (das keine Überschriften enthält)

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

Verwenden Sie abschließend response.getBody(), um Ihr Ergebnis zu erhalten.

Diese Frage ähnelt diese Frage .

118
Richard Neish

Schauen Sie sich das JavaDoc für RestTemplate an.

Es gibt die entsprechenden getForObject - Methoden, die die HTTP-GET-Entsprechungen von postForObject sind, aber anscheinend nicht Ihren Anforderungen von "GET with headers" entsprechen Es gibt keine Möglichkeit, Header für einen der Aufrufe anzugeben.

Mit Blick auf JavaDoc können Sie bei keiner HTTP-GET-spezifischen Methode auch Header-Informationen bereitstellen. Es gibt jedoch Alternativen, von denen Sie eine gefunden haben und verwenden. Mit den exchange -Methoden können Sie ein HttpEntity -Objekt bereitstellen, das die Details der Anforderung (einschließlich der Header) darstellt. Mit den Methoden execute können Sie ein RequestCallback angeben, aus dem Sie die Header beim Aufruf hinzufügen können.

3