web-dev-qa-db-ja.com

RestTemplateを使用したHTTPのヘッダー付き取得

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);
48
rasen58

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 に似ています。

118
Richard Neish

RestTemplateのJavaDoc を見てください。

対応する getForObject メソッドはpostForObjectと同等のHTTP GETですが、「GET with headers」の要件を満たしていないようです。呼び出しのヘッダーを指定する方法はありません。

JavaDocを見ると、HTTP GET固有のメソッドではヘッダー情報も提供できません。ただし、代替手段があり、そのうちの1つを見つけて使用しています。 exchangeメソッドを使用すると、リクエストの詳細(ヘッダーを含む)を表すHttpEntityオブジェクトを提供できます。 executeメソッドを使用すると、呼び出し時にヘッダーを追加できるRequestCallbackを指定できます。

3