1. ホーム
  2. spring

[解決済み] RestTemplateを使ったヘッダ付きHTTP get

2023-02-04 10:05:13

質問

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

どのように解決するのですか?

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() を使って結果を得ます。

この質問は、次のものに似ています。 この質問 .