このガイドでは、RESTful Web サービスを使用するアプリケーションを作成するプロセスを順を追って説明します。

構築するもの

Spring の RestTemplate を使用して、https://gturnquist-quoters.cfapps.io/api/random (英語) でランダムな Spring Boot の引用を取得するアプリケーションを作成します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Spring Initializr から開始に進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-consuming-rest/complete のコードに対して結果を確認できます。

Spring Initializr から開始

すべての Spring アプリケーションの場合、Spring Initializr (英語) から開始できます。Initializr は、アプリケーションに必要なすべての依存関係をすばやく取り込む方法を提供し、多くのセットアップを行います。この例は Web アプリケーションにすぎない必要があるため、Web 依存関係のみを含める必要があります。次のイメージは、このサンプルプロジェクト用に設定された Initializr を示しています。

initializr
前の図は、Maven がビルドツールとして選択された Initializr を示しています。Gradle も使用できます。また、com.example および consuming-rest の値をそれぞれグループおよびアーティファクトとして表示します。このサンプルの残りの部分では、これらの値を使用します。

次のリストは、Maven を選択したときに作成される pom.xml ファイルを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.7.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>consuming-rest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>consuming-rest</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

次のリストは、Gradle を選択したときに作成される build.gradle ファイルを示しています。

plugins {
	id 'org.springframework.boot' version '2.1.7.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

spring-boot-starter-web には、JSON を操作するために必要な Jackson クラスなど、Web アプリケーションを構築するために必要なものがすべて含まれているため、これらのビルドファイルはこのように簡単になります。

REST リソースの取得

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

RESTful サービスが https://gturnquist-quoters.cfapps.io/api/random (英語) で立ち上がっています。Spring Boot に関する引用をランダムに取得し、JSON ドキュメントとして返します。

Web ブラウザまたは curl を介してその URL をリクエストすると、次のような JSON ドキュメントを受け取ります。

{
   type: "success",
   value: {
      id: 10,
      quote: "Really loving Spring Boot, makes stand alone Spring apps easy."
   }
}

これは、ブラウザを介して、または curl を通じてときにフェッチものすごく便利なのは簡単ではないです。

REST Web サービスを利用するより便利なメソッドは、プログラムを使用することです。そのタスクを支援するために、Spring は RestTemplate(Javadoc) と呼ばれる便利なテンプレートクラスを提供します。RestTemplate は、ほとんどの RESTful サービスとの対話を 1 行の呪文にします。また、そのデータをカスタムドメインタイプにバインドすることもできます。

まず、必要なデータを含むドメインクラスを作成する必要があります。次のリストは、ドメインクラスとして使用できる Quote クラスを示しています。

src/main/java/com/example/consumingrest/Quote.java

package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Quote {

  private String type;
  private Value value;

  public Quote() {
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public Value getValue() {
    return value;
  }

  public void setValue(Value value) {
    this.value = value;
  }

  @Override
  public String toString() {
    return "Quote{" +
        "type='" + type + '\'' +
        ", value=" + value +
        '}';
  }
}

この単純な Java クラスには、いくつかのプロパティと一致する getter メソッドがあります。Jackson JSON 処理ライブラリの @JsonIgnoreProperties でアノテーションが付けられ、このタイプにバインドされていないプロパティは無視する必要があることを示します。

データをカスタムタイプに直接バインドするには、API から返された JSON ドキュメントのキーとまったく同じになるように変数名を指定する必要があります。JSON ドキュメントの変数名とキーが一致しない場合、@JsonProperty アノテーションを使用して JSON ドキュメントの正確なキーを指定できます。(この例では、各変数名を JSON キーに一致させるため、ここでそのアノテーションは必要ありません。)

内部引用自体を埋め込むために、追加のクラスも必要です。Value クラスはそのニーズを満たすものであり、次のリスト(src/main/java/com/example/consumingrest/Value.java)に示されています。

package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Value {

  private Long id;
  private String quote;

  public Value() {
  }

  public Long getId() {
    return this.id;
  }

  public String getQuote() {
    return this.quote;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public void setQuote(String quote) {
    this.quote = quote;
  }

  @Override
  public String toString() {
    return "Value{" +
        "id=" + id +
        ", quote='" + quote + '\'' +
        '}';
  }
}

これは同じアノテーションを使用しますが、他のデータフィールドにマップします。

アプリケーションの終了

Initalizr は、main() メソッドでクラスを作成します。次のリストは、Initializr が(src/main/java/com/example/consumingrest/ConsumingRestApplication.java で)作成するクラスを示しています。

package com.example.consumingrest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumingRestApplication {

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

}

次に、他のいくつかを ConsumingRestApplication クラスに追加して、RESTful ソースからの引用を表示する必要があります。以下を追加する必要があります。

  • ログ(この例ではコンソール)に出力を送信するロガー。

  • Jackson JSON 処理ライブラリを使用して受信データを処理する RestTemplate

  • 起動時に RestTemplate を実行する(その結果、引用を取得する) CommandLineRunner 。

次のリストは、完成した ConsumingRestApplication クラス(src/main/java/com/example/consumingrest/ConsumingRestApplication.java で)を示しています。

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.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
	public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
		return args -> {
			Quote quote = restTemplate.getForObject(
					"https://gturnquist-quoters.cfapps.io/api/random", Quote.class);
			log.info(quote.toString());
		};
	}
}

アプリケーションの実行

コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、およびリソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、およびデプロイできます。

Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar build/libs/gs-consuming-rest-0.1.0.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-consuming-rest-0.1.0.jar
ここで説明する手順は、実行可能な JAR を作成します。クラシック WAR ファイルを作成することもできます。

次のような出力が表示されますが、ランダムな引用が表示されます。

2019-08-22 14:06:46.506  INFO 42940 --- [           main] c.e.c.ConsumingRestApplication           : Quote{type='success', value=Value{id=1, quote='Working with Spring Boot is like pair-programming with the Spring developers.'}}
Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.consumingrest.Quote] という読み取りエラーが表示された場合、バックエンドサービスに接続できない環境にいる可能性があります(バックエンドサービスに到達すると JSON が送信されます)。たぶん企業のプロキシの背後にいます。http.proxyHost および http.proxyPort システムプロパティを環境に適した値に設定してみてください。

要約

おめでとう! Spring Boot を使用して、簡単な REST クライアントを開発しました。