【Spring Boot】公式の「RestTemplate で REST API の利用 」の補足
公式の「RestTemplate で REST API の利用」についての概要
Spring Bootの入門ガイドにある、
ですが、丁寧な説明がないため、補足説明をします。
当入門ガイドの前にある 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 で結果にアクセスできます。
つまづきやすいポイント
ポイントを列挙しておきます。
- 当入門ガイドでは、該当プログラム単独で起動してもエラーが発生する
- 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の結果が、
コンソールに出力されます。
このサンプルでは、別サービスのREST APIをSpring Bootで受け取ることもできるんだよー
という、サンプルでした。