SpringでRESTful Web Service を使う

投稿者: | 2020年2月15日

Springの公式サイト、Getting Started での記述に倣って、RESTful Web Service を使用する機能を作成します。

https://spring.io/guides/gs/rest-service/

 

公式サイトにあるように、今回は以下のサービスにアクセスしてJSON形式のパラメータを取得します。

https://gturnquist-quoters.cfapps.io/api/random

アクセスすればわかるように、下記の様に入れ子構造になっているJSONメッセージを取得できます。

{
    "type": "success",
    "value": {
        "id": 11,
        "quote": "I have two hours today to build an app from scratch. @springboot to the rescue!"
    }
}

 

パッケージのダウンロード

Spring Initializrにアクセスし、”Artifact” 欄を “consuming-rest” とし、”Dependencies” に “Spring Web”を追加したうえで、Generateボタンでダウンロードします。

(Artifactはデフォルトの”demo”のままでも、各クラスのパッケージを適切に変更すれば動きます)

 

落としたzipは解凍して、Cドライブ直下に配置。

 

ドメインクラスの作成

JSONパラメータを格納するためのドメインクラスを作成します。

今回使用するJSONはこのように入れ子構造になっているので、2階層に分けてクラスを作成します。

{
    "type": "success",
    "value": {
        "id": 11,
        "quote": "I have two hours today to build an app from scratch. @springboot to the rescue!"
    }
}

 

“type”, “value” を格納するQuoteクラスと、”value”の下にある “id”, “quote”を格納するValueクラスです。

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 +
        '}';
  }
}
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 + '\'' +
        '}';
  }
}

 

両方とも、@JsonIgnorePropertiesというアノテーションが使われています。

これは「JSON側に存在するが、それを扱うクラスには存在しない」パラメータがある場合、そのパラメータを無視する働きをします。

 

SpringBootApplicationクラスの編集

Spring Initializrに既に存在する ConsumingRestApplication クラスを、次のように編集します。

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

 

RestTemplate はJSONを処理するライブラリであるjacksonを使用し、データを読み込みます。

CommanLineRunner は RestTemplate によって対象URLからJSONパラメータを取得し、スタートアップ画面に結果を表示します。

 

実行結果

コマンドプロンプトで実行してみます。

mvnw spring-boot:run

すると、スタートアップ画面に、JSONの取得結果が確認できました。

c:\consuming-rest>mvnw spring-boot:run
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< com.example:consuming-rest >---------------------
[INFO] Building consuming-rest 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.2.4.RELEASE:run (default-cli) > test-compile @ consuming-rest >>>
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ consuming-rest ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ consuming-rest ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ consuming-rest ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory c:\consuming-rest\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ consuming-rest ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.2.4.RELEASE:run (default-cli) < test-compile @ consuming-rest <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:2.2.4.RELEASE:run (default-cli) @ consuming-rest ---
[INFO] Attaching agents: []

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.4.RELEASE)

2020-02-15 05:10:18.194  INFO 11504 --- [           main] c.e.c.ConsumingRestApplication           : Starting ConsumingRestApplication on MyComputer with PID 11504 (C:\consuming-rest\target\classes started by         in c:\consuming-rest)
2020-02-15 05:10:18.197  INFO 11504 --- [           main] c.e.c.ConsumingRestApplication           : No active profile set, falling back to default profiles: default
2020-02-15 05:10:20.017  INFO 11504 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-02-15 05:10:20.067  INFO 11504 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-02-15 05:10:20.069  INFO 11504 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.30]
2020-02-15 05:10:20.722  INFO 11504 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-02-15 05:10:20.723  INFO 11504 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2489 ms
2020-02-15 05:10:21.193  INFO 11504 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-02-15 05:10:21.451  INFO 11504 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-02-15 05:12:15.269  INFO 11504 --- [           main] c.e.c.ConsumingRestApplication           : Started ConsumingRestApplication in 117.609 seconds (JVM running for 118.886)
2020-02-15 05:12:17.254  INFO 11504 --- [           main] c.e.c.ConsumingRestApplication           : Quote{type='success', value=Value{id=3, quote='Spring has come quite a ways in addressing developer enjoyment and ease of use since the last time I built an application using it.'}}