HTTP 使用 RestTemplate 获取标头
Posted
技术标签:
【中文标题】HTTP 使用 RestTemplate 获取标头【英文标题】:HTTP get with headers using RestTemplate 【发布时间】:2013-05-22 19:29:36 【问题描述】:如何使用 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);
【问题讨论】:
【参考方案1】: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。
【讨论】:
或使用getForEntity()
,它提供getHeaders()
和getBody()
。
@axd getHeaders() 将得到 response 标头,问题是如何设置 request 标头。
从原始类型更改为HttpEntity<?> entity = new HttpEntity<Object>(headers)
这是最近的更详细的文档,其中包含示例代码和您可能需要的所有可能变化(以及反序列化为所需的响应类型):attacomsian.com/blog/…
@user7294900:更好的HttpEntity<Void> requestEntity = new HttpEntity<>(headers);
【参考方案2】:
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
【讨论】:
【参考方案3】:看看JavaDoc for RestTemplate。
有相应的getForObject
方法是postForObject
的HTTP GET 等效方法,但它们似乎不能满足您对“带有标头的GET”的要求,因为无法在任何一个上指定标头来电。
查看 JavaDoc,没有特定于 HTTP GET 的方法允许您同时提供标头信息。不过,还有其他选择,您已经找到并正在使用其中一种。 exchange
方法允许您提供一个 HttpEntity
对象来表示请求的详细信息(包括标头)。 execute
方法允许您指定一个 RequestCallback
,您可以在调用它时添加标头。
【讨论】:
我看过了,getForObject
没有允许我指定headers的参数
你是对的,似乎没有办法指定标题。 JavaDoc 是为你准备的。什么对您当前的代码不起作用?从你的问题很难看出。
我不知道什么不起作用,因为没有错误,但它只是没有发送或获取数据以上是关于HTTP 使用 RestTemplate 获取标头的主要内容,如果未能解决你的问题,请参考以下文章
使用restTemplate发送带有身份验证标头的GET请求
如何使用带有Json主体和标头的RestTemplate进行POST调用? [重复]
在 Spring 中向 RestTemplate 的 postForObject() 方法添加标头
如何在 Spring RestTemplate 请求上设置“Accept:”标头?
Spring Security (OAuth):如何在未公开 restTemplate 时添加请求标头?
如何使用 Spring Boot RestTemplate 将 Microsoft Office Mime 类型作为 Content-Type 标头发送