使用RestTemplate的HTTP获取标头


72

如何使用Spring RestTemplate发送GET请求?其他问题已使用POST,但我需要使用GET。当我运行它时,该程序继续工作,但是似乎网络被阻塞了,因为它在AsyncTask中,当我单击该按钮后尝试运行另一个asynctask时,它们将无法工作。

我试着做

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

Answers:


184

RestTemplategetForObject()方法不支持设置标题。解决方法是使用该exchange()方法。

因此restTemplate.getForObject(url, String.class, param),请使用(而不是没有标题)

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

最后,使用response.getBody()来获得结果。

这个问题类似于这个问题


1
或使用getForEntity(),提供getHeaders()getBody()
axd

25
@axd getHeaders()将获取响应头,问题是如何设置请求头。
理查德·尼什

2
从原始类型更改为HttpEntity<?> entity = new HttpEntity<Object>(headers)
user7294900'5

4

看一下JavaDoc for RestTemplate

有与对应getForObject的HTTP GET方法postForObject,但是它们似乎无法满足您的“带标头的GET”要求,因为无法在任何调用上指定标头。

查看JavaDoc,没有特定于HTTP GET的方法允许您也提供标头信息。但是,还有其他选择,您已经找到并正在使用其中一种。这些exchange方法允许您提供一个HttpEntity代表请求详细信息的对象(包括标头)。这些execute方法允许您指定一个RequestCallback,调用时可以从中添加标头。


1
我已经看过了,并且getForObject没有允许我指定标头的参数
rasen58

您是正确的,似乎没有办法指定标题。JavaDoc在那里为您服务。对您当前的代码无效的是什么?从您的问题很难分辨。
nicholas.hauschild

我不知道什么不起作用,因为没有错误,但是它只是不发送或获取数据
rasen58
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.