Springを使ったAPIの実装方法
公開日: 2022/10/12
更新日: 2022/10/12
そもそもAPIとは、簡単に言うと他社が作った機能を自社のサービスに簡単に取り入れることができます。
例として、自分が住んでいる地域の天気予報が知りたいときにAPIを利用すると、住んでいる地域の情報を引数として相手に教えてあげると結果として自分の住んでいる地域の天気予報データが取得できたりします。
他にも、運送業者などが荷物発送のタイミングでメッセージアプリのAPIを利用すると荷物の発送通知などが利用者に簡単に伝えることができます。
APIを利用すると自社システムの開発の工数を減らすことができ、API利用可能なサービスはAPIを利用することでスムーズに自社のシステムに取り入れることができます。
ただメリットばかりではなくデメリットもあります。
APIの仕様変更やサービスの停止でシステムがうまく動作しなくなったり、APIを運用しているサーバーで不具合があったときはAPIは利用できず APIを過剰に利用せず自社システムである程度対処できるようにしておくことも大事です。
例として、自分が住んでいる地域の天気予報が知りたいときにAPIを利用すると、住んでいる地域の情報を引数として相手に教えてあげると結果として自分の住んでいる地域の天気予報データが取得できたりします。
他にも、運送業者などが荷物発送のタイミングでメッセージアプリのAPIを利用すると荷物の発送通知などが利用者に簡単に伝えることができます。
APIを利用すると自社システムの開発の工数を減らすことができ、API利用可能なサービスはAPIを利用することでスムーズに自社のシステムに取り入れることができます。
ただメリットばかりではなくデメリットもあります。
APIの仕様変更やサービスの停止でシステムがうまく動作しなくなったり、APIを運用しているサーバーで不具合があったときはAPIは利用できず APIを過剰に利用せず自社システムである程度対処できるようにしておくことも大事です。
1. 環境
Eclipse(Version: 2022-09 (4.25.0))
Java17
Spring2.7.4
PostgreSQL)14.5
Java17
Spring2.7.4
PostgreSQL)14.5
2. PSQLのテーブルの作成
データを格納するためのテーブルを作成します。
テーブル作成などはPSQLの場合pgAdminなどを使うと簡単に行えます。
SQLCREATE文
テーブル作成などはPSQLの場合pgAdminなどを使うと簡単に行えます。
SQLCREATE文
CREATE TABLE IF NOT EXISTS public.syain
(
syainkbn integer,
age integer,
sex character varying(5) COLLATE pg_catalog."default",
name character varying(20) COLLATE pg_catalog."default",
id integer NOT NULL DEFAULT nextval('syain_id_seq'::regclass),
delete_flag boolean
)
3. SpringとPSQLの接続設定
application.propertiesにDBの接続情報を記載します。
DBの接続設定{}の中はそれぞれ設定してください。
pom.xmlに依存関係を記載します。
依存関係の追加
DBの接続設定{}の中はそれぞれ設定してください。
spring.datasource.url=jdbc:postgresql://{IPアドレス:DBのPORT/データベース名}
spring.datasource.username={ユーザー名}
spring.datasource.password={パスワード}
spring.jpa.database=POSTGRESQL
pom.xmlに依存関係を記載します。
依存関係の追加
org.springframework.boot
spring-boot-starter-data-jpa
org.postgresql
postgresql
runtime
4. Molel、Repositoryクラスの作成
先ほど作成したテーブルにデータを入れる際に必要なDTOの作成を行います。
SyainDtoクラスを作成します。
こちらはJSONに入っているデータを受け取るときに使用します。
JSON用のDTO作成
DB登録、更新用のEntityを作成します。
アノテーションの説明
@Entity
Entityクラスであることを宣言する。
@Table(name = "{対象のテーブル名}")
Entityに対応するテーブル名を記載する
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
プライマリキーに対しては上記のアノテーションを記載する。
@Column(name = "{対象のカラム名}")
テーブルの実際のカラム名を指定する。
テーブル用のentity作成
こちらのクラスでメソッド自動生成されるのでデータの取得や更新、削除が容易にできる。
アノテーションの説明
@Repository
Repositoryクラスであることを宣言する。
Repositoryクラスの作成
SyainDtoクラスを作成します。
こちらはJSONに入っているデータを受け取るときに使用します。
JSON用のDTO作成
package com.example.demo.model;
public class SyainDto {
private Integer id;
private Integer syainKbn;
private Integer age;
private String sex;
private String name;
public Integer getSyainKbn() {
return syainKbn;
}
public void setSyainKbn(Integer syainKbn) {
this.syainKbn = syainKbn;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
DB登録、更新用のEntityを作成します。
アノテーションの説明
@Entity
Entityクラスであることを宣言する。
@Table(name = "{対象のテーブル名}")
Entityに対応するテーブル名を記載する
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
プライマリキーに対しては上記のアノテーションを記載する。
@Column(name = "{対象のカラム名}")
テーブルの実際のカラム名を指定する。
テーブル用のentity作成
package com.example.demo.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "syain")
public class TestApi {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "syainkbn")
private Integer syainKbn;
@Column(name = "age")
private Integer age;
@Column(name = "sex")
private String sex;
@Column(name = "name")
private String name;
@Column(name = "delete_flag")
private boolean deleteFlag;
public boolean isDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(boolean deleteFlag) {
this.deleteFlag = deleteFlag;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getSyainKbn() {
return syainKbn;
}
public void setSyainKbn(Integer syainKbn) {
this.syainKbn = syainKbn;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
こちらのクラスでメソッド自動生成されるのでデータの取得や更新、削除が容易にできる。
アノテーションの説明
@Repository
Repositoryクラスであることを宣言する。
Repositoryクラスの作成
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.model.TestApi;
@Repository
public interface TestApiRepository extends JpaRepository {
}
5. サービスクラスの作成
先ほど作ったRepositoryを使用してデータを登録、更新する処理をこちらで実装する。
アノテーションの説明
@Service
Serviceクラスであることを宣言する
@Autowired
フレームワーク上で自動でインスタンス作成が行われる
アノテーションの説明
@Service
Serviceクラスであることを宣言する
@Autowired
フレームワーク上で自動でインスタンス作成が行われる
package com.example.demo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.model.SyainDto;
import com.example.demo.model.TestApi;
import com.example.demo.repository.TestApiRepository;
@Service
public class TestApiService {
@Autowired
TestApiRepository testApiRepository;
//受け取ったデータをDBに登録する
public void createSyain(TestApi createSyain) {
testApiRepository.save(createSyain);
}
//受け取った複数のデータをDBに登録する
public void createSyainList(List createSyain) {
testApiRepository.saveAll(createSyain);
}
//受け取ったデータでDBを更新する
public void deleteSyain(SyainDto deleteSyain) {
TestApi getSyain = testApiRepository.findById(deleteSyain.getId()).orElseThrow();
getSyain.setDeleteFlag(true);
testApiRepository.save(getSyain);
}
//受け取った複数のデータでDBを更新する
public void deleteSyainList(List deleteSyain) {
List testApi = new ArrayList<>();
for (SyainDto syainDto : deleteSyain) {
TestApi getSyain = testApiRepository.findById(syainDto.getId()).orElseThrow();
getSyain.setDeleteFlag(true);
testApi.add(getSyain);
}
testApiRepository.saveAll(testApi);
}
}
6. コントローラークラスの作成
JSONからのデータの受け取りデータの登録、更新処理を実施する。
アノテーションの説明
@RestController
APIサーバー用コントローラーの宣言
@RequestMapping(value = "/{任意のurl}", method = { RequestMethod.{GETまたはPOST} })
Valueに指定したurlに接続がmethodと一致した際にこのアノテーションが付与されたメソッド実行する。
アノテーションの説明
@RestController
APIサーバー用コントローラーの宣言
@RequestMapping(value = "/{任意のurl}", method = { RequestMethod.{GETまたはPOST} })
Valueに指定したurlに接続がmethodと一致した際にこのアノテーションが付与されたメソッド実行する。
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.model.SyainDto;
import com.example.demo.model.TestApi;
import com.example.demo.service.TestApiService;
@RestController
@RequestMapping("api")
public class ApiController {
@Autowired
TestApiService testApiService;
//JSON形式で受け取ったデータをDBに登録する
@RequestMapping(value = "/create", method = { RequestMethod.POST })
public void createSyain(@RequestBody SyainDto createSyain) {
TestApi testApi = new TestApi();
testApi.setAge(createSyain.getAge());
testApi.setSyainKbn(createSyain.getSyainKbn());
testApi.setSex(createSyain.getSex());
testApi.setName(createSyain.getName());
testApi.setDeleteFlag(false);
testApiService.createSyain(testApi);
}
//JSON形式で受け取った複数データをDBに登録する
@RequestMapping(value = "/createList", method = { RequestMethod.POST })
public void createSyainList(@RequestBody List createSyain) {
List createApiList = new ArrayList<>();
for (SyainDto syainData : createSyain) {
TestApi testApi = new TestApi();
testApi.setAge(syainData.getAge());
testApi.setSyainKbn(syainData.getSyainKbn());
testApi.setSex(syainData.getSex());
testApi.setName(syainData.getName());
testApi.setDeleteFlag(false);
createApiList.add(testApi);
}
testApiService.createSyainList(createApiList);
}
//JSON形式で受け取ったデータでD
7. APIの実行
APIの実行はCurlでリクエスト送信して行う。
JSONを読み込ませる(データ登録1件のパターン)
(データ登録複数件のパターン)
(データ更新1件のパターン)
(データ更新複数件のパターン)
(データ登録複数件のパターン)
(データ更新1件のパターン)
(データ更新複数件のパターン)
Curlコマンドの例
JSONを直接書き込む(データ登録1件のパターン)
curl -X POST -H "Content-Type: application/json" -d "{\"syainKbn\" : \"1\" , \"age\" : \"20\" , \"sex\" : \"man\" , \"name\" : \"takahaki youhei\"}" {IPアドレス:ポート番号}/api/create
JSONを読み込ませる(データ登録1件のパターン)
curl -X POST -d @{JSONファイルのフルパス} -H "Content-Type: application/json" localhost:8080/api/create
(データ登録複数件のパターン)
curl -X POST -d @{JSONファイルのフルパス} -H "Content-Type: application/json" localhost:8080/api/createList
(データ更新1件のパターン)
curl -X POST -d @{JSONファイルのフルパス} -H "Content-Type: application/json" localhost:8080/api/delete
(データ更新複数件のパターン)
curl -X POST -d @{JSONファイルのフルパス} -H "Content-Type: application/json" localhost:8080/api/deleteList
JSONファイルの例
(データ登録1件のパターン)
{
"syainKbn": 2020,
"age": 42,
"sex": "man",
"name": "yositake haruo"
}
(データ登録複数件のパターン)
[
{
"syainKbn": 1997,
"age": 17,
"sex": "man",
"name": "take hiroto"
},
{
"syainKbn": 2022,
"age": 42,
"sex": "man",
"name": "kage gennki"
},
{
"syainKbn": 1988,
"age": 33,
"sex": "man",
"name": "itikai taiga"
}
]
(データ更新1件のパターン)
{
"id": 4
}
(データ更新複数件のパターン)
[
{
"id": 5
},
{
"id": 6
},
{
"id": 7
}
]
8. まとめ
APIについて少し学べたのでやってよかった。
JSONファイルの作り方やCurlコマンド、Springの仕様などまだまだ わからないところが多いので今後もう少し勉強して高度な機能を実装できればと思いました。
JSONファイルの作り方やCurlコマンド、Springの仕様などまだまだ わからないところが多いので今後もう少し勉強して高度な機能を実装できればと思いました。