HTTP使用RestTemplate获取标头

ras*_*n58 49 spring android get http 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);
Run Code Online (Sandbox Code Playgroud)

Ric*_*ish 127

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);
Run Code Online (Sandbox Code Playgroud)

最后,response.getBody()用来获得你的结果.

这个问题与这个问题类似.

  • @axd getHeaders()将获得_response_标头,问题是如何设置_request_标头. (16认同)
  • 从原始类型更改为 `HttpEntity&lt;?&gt;Entity = new HttpEntity&lt;Object&gt;(headers)` (3认同)

nic*_*ild 5

查看RestTemplateJavaDoc

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

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

  • 我看过它,“getForObject”没有允许我指定标头的参数 (2认同)