97

如何使用 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);
4

3 回答 3

240

RestTemplategetForObject()方法不支持设置标头。解决方法是使用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()得到你的结果。

这个问题类似于这个问题

于 2014-10-09T09:19:44.807 回答
6

查看RestTemplate的JavaDoc 。

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

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

于 2013-05-28T00:59:38.573 回答
0

RestTemplate 的 getForObject() 方法不支持设置 headers。你可以用这个

syntax

restTemplate.exchange(url 端点,HttpMethod.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 
  }
于 2021-07-19T15:12:54.853 回答