使用 RestTemplate 获取带有头部的 HTTP

如何使用 SpringRestTemplate 发送 GET 请求? 其他问题使用 POST,但我需要使用 GET。 当我运行这个程序时,程序继续工作,但似乎网络是阻塞的,因为这是在一个异步任务,当我试图运行另一个异步任务后,我点击这个按钮,他们不会工作。

我试过了

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);
183174 次浏览

看看 用于 RestTemplate 的 JavaDoc

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

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

RestTemplate getForObject()方法不支持设置标头。解决方案是使用 exchange()方法。

因此,不要使用 restTemplate.getForObject(url, String.class, param)(它没有头) ,而是使用

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

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

这个问题类似于 this question

RestTemplate 的 getForObject ()方法不支持设置 Header

返回文章页面

Exchange (url 端点, GET,实体,参数)

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
}