公式の「RestTemplate で REST API の利用」についての概要

Spring Bootの入門ガイドにある、

RestTemplate で REST API の利用

ですが、丁寧な説明がないため、補足説明をします。

当入門ガイドの前にある REST API の作成 は、Spring Bootを使用した、

とても基本的な、REST API アプリケーションを構築できました。

RestTemplate で REST API の利用も、同様の手順かと思い、

サンプルをダウンロードしてそのまま実行して、エラーとなるケースが多いと思います。

以降、解説します。

REST API の作成 は、サーバーサイドのREST APIそのものを構築しました。

一方、RestTemplate で REST API の利用 は、サーバー側に何かしら、REST APIサービスがある前提で、

Spring Boot 側では、そのAPIの結果JSONをただ受け取って表示する、というサンプルです。

ConsumingRestApplication.java のコードの中に、http://localhost:8080/api/random の記述があり、

エンドポイントを呼び出している部分があることがわかります。

package com.example.consumingrest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ConsumingRestApplication {

    private static final Logger log = LoggerFactory.getLogger(ConsumingRestApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(ConsumingRestApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Bean
    @Profile("!test")
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            Quote quote = restTemplate.getForObject(
                    "http://localhost:8080/api/random", Quote.class);
            log.info(quote.toString());
        };
    }
}

つまり、このサンプルでは、もう一つ、REST APIサービスが起動していることが前提となっています。

ドキュメント中の以下の記述は、もう一つサービスを起動しておくことを示しています。

(パッと見わかりにくいですね)

REST リソースの取得
プロジェクトのセットアップが完了すると、RESTful サービスを使用する単純なアプリケーションを作成できます。

その前に、REST リソースのソースが必要です。そのようなサービスの例を https://github.com/spring-guides/quoters (英語) で提供しました。そのアプリケーションを別のターミナルで実行し、http://localhost:8080/api/random で結果にアクセスできます。

つまづきやすいポイント

ポイントを列挙しておきます。

  1. 当入門ガイドでは、該当プログラム単独で起動してもエラーが発生する
  2. REST API 側のWebサービスのポートが8080を使用しているため、RestTemplate側のポートもデフォルト8080のため、起動してもエラーが発生する

該当プログラム単独で起動してもエラーが発生する に対処する

公式ドキュメントにも記載自体はありますが、わかりにくいので、箇条書き手順を示します。

  • https://github.com/spring-guides/quoters を、git clone などでダウンロードする
  • Eclipse の「ファイル・システムからプロジェクトを開く...」や「インポート」でプロジェクトを読み込む
  • 「quoters」プロジェクトが読み込まれたら、ビルドする(自動ビルド設定の場合はビルドが終わるのを待つ)
  • 「quoters」プロジェクトを Spring Bootアプリケーションとして実行する
  • quoters REST API Webサーバーが正常に起動する
  • 公式ドキュメントにある通り、「http://localhost:8080/api/random 」「http://localhost:8080/api/」「http://localhost:8080/api/1 」等のエンドポイントを、ブラウザ(Postmanやcurlでも可)のURLから実行して、JSONが返されることを確認する

これで、REST API Webサーバー側の準備ができました。

REST API 側のWebサービスのポートが8080を使用しているため、RestTemplate側のポートもデフォルト8080のため、起動してもエラーが発生する

そのまま、gs-consuming-rest プロジェクトを、Spring Bootアプリケーションとして起動しても、8080ポートが既に使用されているためエラーが発生して起動しません。

そこで、以下の手順で、gs-consuming-rest プロジェクトの使用ポートを8081に変更します。

  • src/main 配下に resources フォルダを新規作成する
  • 「resources」フォルダ配下に application.properties ファイルを作成する
  • application.properties ファイルに以下の記述をして保存する
server.port=8081
  • コマンドプロンプトやターミナルで(Mavenの場合) mvnw spring-boot:run を実行する

公式にもある通り、以下のように、http://localhost:8080/api/random のJSONの結果が、

コンソールに出力されます。

RestTemplate で REST API を呼び出した結果

このサンプルでは、別サービスのREST APIをSpring Bootで受け取ることもできるんだよー

という、サンプルでした。