HTTP-Get mit Headern über RestTemplate

72

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 in einer AsyncTask befindet. 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);
rasen58
quelle

Antworten:

184

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

restTemplate.getForObject(url, String.class, param)Verwenden Sie also anstelle von (ohne Header)

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 response.getBody()Sie schließlich, um Ihr Ergebnis zu erhalten.

Diese Frage ähnelt dieser Frage .

Richard Neish
quelle
1
oder verwenden getForEntity(), welche Angebote getHeaders()und getBody().
Axd
25
@axd getHeaders () die erhaltene Antwort - Header, ist die Frage , wie die festlegen Anfrage - Header.
Richard Neish
2
Wechsel vom HttpEntity<?> entity = new HttpEntity<Object>(headers)
Rohtyp
4

Schauen Sie sich JavaDoc for RestTemplate an .

Es gibt die entsprechenden getForObjectMethoden, die die HTTP-GET-Äquivalente von sindpostForObject , aber sie scheinen Ihre Anforderungen von "GET mit Headern" nicht zu erfüllen, da es keine Möglichkeit gibt, Header für einen der Aufrufe anzugeben.

Mit Blick auf JavaDoc können Sie mit keiner HTTP-GET-spezifischen Methode auch Header-Informationen bereitstellen. Es gibt jedoch Alternativen, von denen Sie eine gefunden haben und verwenden. Mit den exchangeMethoden können Sie ein HttpEntityObjekt bereitstellen, das die Details der Anforderung darstellt (einschließlich Header). Mit den executeMethoden können Sie eine angeben, RequestCallbackaus der Sie die Header beim Aufruf hinzufügen können.

nicholas.hauschild
quelle
1
Ich habe getForObjectes mir angesehen und habe keinen Parameter, mit dem ich die Header angeben kann
rasen58
Sie haben Recht, es scheint, dass es keine Möglichkeit gibt, die Überschriften anzugeben. Das JavaDoc ist jedoch für Sie da. Was funktioniert bei Ihrem aktuellen Code nicht? Es ist schwer von Ihrer Frage zu unterscheiden.
nicholas.hauschild
Ich weiß nicht, was nicht funktioniert, weil es keinen Fehler gibt, aber es ist nur nicht das Senden oder
Abrufen