HTTP使用RestTemplate获取标头

时间:2013-05-27 23:10:53

标签: android spring http get resttemplate

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

3 个答案:

答案 0 :(得分:96)

RestTemplate getForObject()方法不支持设置标头。解决方案是使用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()来获得结果。

此问题与this question类似。

答案 1 :(得分:3)

查看JavaDoc for RestTemplate

有相应的getForObject方法,它们是{GID与标题相关的GET,但它们似乎无法满足您对“GET with headers”的要求,因为无法指定任何一个电话的标题。

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

答案 2 :(得分:0)

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

syntax

<块引用>

restTemplate.exchange(url 端点, HttpMethod.GET,entity, params)

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 
  }