Overview
このチュートリアルでは、Spring REST Client – RestTemplate – が使用でき、かつうまく使用できる幅広い操作を説明します。
すべての例のAPI側では、ここからRESTfulなサービスを実行します。
Further reading:
Basic Authentication with the RestTemplate
RestTemplateでダイジェスト認証
Exploring the Spring Boot TestRestTemplate
Deprecation Notice
Spring Framework 5では、WebFluxスタックとともに、SpringはWebClientという新しいHTTPクライアントを導入しました。
WebClientはRestTemplateに代わる最新のHTTPクライアントです。
WebClientは、RestTemplateに代わる最新のHTTPクライアントです。伝統的な同期APIを提供するだけでなく、効率的なノンブロッキングおよび非同期のアプローチもサポートしています。
Use GET to Retrieve Resources
3.1.
RestTemplate restTemplate = new RestTemplate();String fooResourceUrl = "http://localhost:8080/spring-rest/foos";ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
RestTemplate restTemplate = new RestTemplate();String fooResourceUrl = "http://localhost:8080/spring-rest/foos";ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
HTTP レスポンスに完全にアクセスできることに注意してください。これにより、ステータス コードをチェックして操作が成功したことを確認したり、レスポンスの実際のボディを操作したりすることができます。
ObjectMapper mapper = new ObjectMapper();JsonNode root = mapper.readTree(response.getBody());JsonNode name = root.path("name");assertThat(name.asText(), notNullValue());
ここでは、レスポンス ボディを標準の文字列として扱い、Jackson (および Jackson が提供する JSON ノード構造) を使用していくつかの詳細を確認しています。
3.2. JSON の代わりに POJO を取得する
応答を直接 Resource DTO にマッピングすることもできます。
public class Foo implements Serializable { private long id; private String name; // standard getters and setters}
これで、テンプレートで getForObject API を簡単に使用することができます。
Foo foo = restTemplate .getForObject(fooResourceUrl + "/1", Foo.class);assertThat(foo.getName(), notNullValue());assertThat(foo.getId(), is(1L));
Use HEAD to Retrieve Headers
ここで、より一般的な方法に移る前に、HEADの使用方法を簡単に見てみましょう。
ここでは headForHeaders() API を使用します。
HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl);assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON));
Use POST to Create a Resource
API で新しい Resource を作成するには、postForLocation()、postForObject()、または postForEntity() API をうまく利用することにしましょう。
前者は新しく作成されたResourceのURIを返し、後者はResourceそのものを返します。
5.1.
5.1. postForObject() API
RestTemplate restTemplate = new RestTemplate();HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);assertThat(foo, notNullValue());assertThat(foo.getName(), is("bar"));
5.2. postForLocation()API
同様に、完全なResourceを返すのではなく、新しく作成されたResourceのLocationを返す操作を見てみましょう:
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));URI location = restTemplate .postForLocation(fooResourceUrl, request);assertThat(location, notNullValue());
5.3. Exchange() API
より一般的なExchange APIでPOSTを行う方法を見てみましょう:
RestTemplate restTemplate = new RestTemplate();HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));ResponseEntity<Foo> response = restTemplate .exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); Foo foo = response.getBody(); assertThat(foo, notNullValue());assertThat(foo.getName(), is("bar"));
5.4. 5.4.フォームデータの送信
次に、POST メソッドを使用してフォームを送信する方法を見てみましょう。
まず、Content-Type ヘッダーを application/x-www-form-urlencoded に設定する必要があります。
これにより、&:
HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
フォーム変数をLinkedMultiValueMapにラップすることができます。
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();map.add("id", "1");
次に、HttpEntityインスタンスを使用してRequestを構築します:
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
最後に、restTemplate.postForEntity()を呼び出してRESTサービスに接続します。postForEntity()をEndpointに呼び出してRESTサービスに接続します。
ResponseEntity<String> response = restTemplate.postForEntity( fooResourceUrl+"/form", request , String.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
Use OPTIONS to Get Allowed Operations
次に、OPTIONSリクエストを使用し、この種のリクエストを使用して特定のURIで許可される操作を調べる方法を簡単に見てみましょう。
Set<HttpMethod> optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl);HttpMethod supportedMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE};assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods)));
Use PUT to Update a Resource
次に、PUTについて、より具体的にはこの操作のための exchange() API について見ていきます。
7.1. Simple PUT With exchange()
まず、API に対する単純な PUT 操作を行います。 PUT with exchange() and a Request Callback
次に、リクエスト コールバックを使用して PUT を発行します。
コールバックを用意して、必要なヘッダーやリクエストボディを設定しましょう。
RequestCallback requestCallback(final Foo updatedInstance) { return clientHttpRequest -> { ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); clientHttpRequest.getHeaders().add( HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); clientHttpRequest.getHeaders().add( HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); };}
次に、POSTリクエストでResourceを作成します。
ResponseEntity<Foo> response = restTemplate .exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
そして、Resourceを更新します:
Foo updatedInstance = new Foo("newName");updatedInstance.setId(response.getBody().getId());String resourceUrl =fooResourceUrl + '/' + response.getBody().getId();restTemplate.execute( resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null);
Use DELETE to Remove a Resource
既存のResourceを削除するには、delete()APIを素早く使用します。
String entityUrl = fooResourceUrl + "/" + existingResource.getId();restTemplate.delete(entityUrl);
Configure Timeout
ClientHttpRequestFactoryを使用するだけで、RestTemplateがタイムアウトするように設定することができます:
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());private ClientHttpRequestFactory getClientHttpRequestFactory() { int timeout = 5000; HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); clientHttpRequestFactory.setConnectTimeout(timeout); return clientHttpRequestFactory;}
さらに、HttpClientを使用して設定することもできます。
private ClientHttpRequestFactory getClientHttpRequestFactory() { int timeout = 5000; RequestConfig config = RequestConfig.custom() .setConnectTimeout(timeout) .setConnectionRequestTimeout(timeout) .setSocketTimeout(timeout) .build(); CloseableHttpClient client = HttpClientBuilder .create() .setDefaultRequestConfig(config) .build(); return new HttpComponentsClientHttpRequestFactory(client);}
おわりに
この記事では、RestTemplateを使用して、主なHTTP Verbsと、これらすべてを使用してリクエストを編成する方法について説明しました。
テンプレートで認証を行う方法を詳しく知りたい場合は、Basic Auth with RestTemplateの記事をご覧ください。
これらすべての例とコードスニペットの実装は、GitHubで見ることができます。
Learn SpringコースでSpring 5とSpring Boot 2を始めましょう:
>> CHECK OUT THE COURSE