HTTP 使用 RestTemplate 获取标头

新手上路,请多包涵

如何使用 Spring RestTemplate 发送 GET 请求?其他题都用了POST,但是我需要用GET。当我运行这个程序时,程序继续工作,但似乎网络被阻塞了,因为它在一个 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);

原文由 rasen58 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 359
2 个回答

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

这个问题类似于 这个问题

原文由 Richard Neish 发布,翻译遵循 CC BY-SA 4.0 许可协议

查看 RestTemplate 的 JavaDoc

有相应的 getForObject HTTP GET 等价于 postForObject 的方法,但它们似乎无法满足您对“GET with headers”的要求,因为没有办法在任何调用上指定标头。

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

原文由 nicholas.hauschild 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题