[Spring] RESTful Web Serviceを構築

投稿者: | 2021年2月1日

Springには、RESTful Web Serviceを極めて簡単に実装する仕組みがあります。

HTTP GETリクエストを受けると、パラメータをJSON形式で返却するサービスの構築について説明します。

環境は、Windows 10 Home です。

やりたいこと

httpリクエストを送ると(ブラウザでURLにアドレスを入れると)、パラメータをJSON形式で表示します。

httpリクエストを送ると

パラメータを表示します。

環境構築

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

今回はIDEを使用せず、スクラッチで構築してみます。

必要なライブラリが揃った状態とするため、Spring Initializr からパッケージをダウンロードします。

Dependencies に “Spring Web” を追加して、”GENERATE” ボタンを押します。

“demo” という名称のzipファイルができるので、それを適当な場所に解凍し配置します。

ここでは C:\demo としました。

クラスファイルの作成

Resourceクラスの作成

JSONを表現するResourceクラスを作成します。

package com.example.demo;
 
public class PersonInfo {
 
	private final String name;
	
	public PersonInfo(String name) {
		this.name = name;
	}
 
	public String getName() {
		return name;
	}
	
}

フィールドは、”name” のみのシンプルなクラスです。

Controllerクラスの作成

次にControllerクラスを作成します。

リクエスト・パラメータに渡すことで、name は変更可能となっています。

パラメータが何も渡されなければ、デフォルトで “Taro” を格納します。

package com.example.demo;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class PersonInfoController {
 
	private static final String template = "%s";

	@GetMapping("/personinfo")
	public PersonInfo personinfo(@RequestParam(value = "name", defaultValue = "Taro") String name) {
		return new PersonInfo(String.format(template, name));
	}
}

クラスファイルの配置

作成した2つのクラスファイルを、”demo”パッケージ下に配置します。

留意点 – java versionの確認

ここまで来たら実行するだけですが、留意点として、java version の確認が挙げられます。

パッケージ内のpom.xmlと、実行環境のjavaバージョンが合っていないと、起動時に失敗しますので、もし違っていたら合わせておきましょう。

実行環境のjava version

c:\demo>java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

pom.xmlのjava version

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

両者のバージョンが合っていないと、起動時に”無効なターゲット・リリース”であるというエラーが発生します。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project demo: Fatal error compiling: 11は無効なターゲット・リリースです -> [Help 1]

動作確認

コマンドプロンプトでカレント・ディレクトリをdemoフォルダの場所に合わせ、mvnw spring-boot:run コマンドを実行します。

c:\demo>mvnw spring-boot:run

Springが起動したら、URLからリクエストしてみます。

おまけ – ネストしたJSONデータを作る

上記の例では、フラットなJSONデータを生成していましたが、ネストしたJSONデータを作りたい場合もあります。

JSONデータはJavaのResourceクラスに対応していますので、Javaのクラスも同様の構成にすればOKです。

例として、先ほどのケースに”Address”という項目を追加し、情報の階層構造を作りたいとします。

{
    "name": "Ichiro",
    "address": {
        "zip": "100-0000",
        "city": "Tokyo",
        "street": "1-1-1"
    }
}

このような場合は、まず “address” 情報を格納する “Address” クラスを作り、そして “PersonInfo” クラスのフィールドとして “Address” クラスを追加します。

【Address.java】
package com.example.demo;
 
public class Address {

	private final String zip;
	private final String city;
	private final String street;
	
	public Address() {
		this.zip = "100-0000";
		this.city = "Tokyo";
		this.street = "1-1-1";
	}
 
	public String getZip() {
		return zip;
	}
 
	public String getCity() {
		return city;
	}
	
	public String getStreet() {
		return street;
	}
}
【PersonInfo.java】

package com.example.demo;
 
public class PersonInfo {
 
	private final String name;
	private final Address address; // add the field
	
	public PersonInfo(String name) {
		this.name = name;
		this.address = new Address(); // add the field
	}
 
	public String getName() {
		return name;
	}
	
	// add the method	
	public Address getAddress() {
		return address; 
	}
	
}

Springを起動し、URLを開くと、このような結果が得られます。