Spring Boot で REST API を作成する方法

Spring Boot で REST API を作成する方法

REST は REpresentational State Transfer の略で、API は Application Programming Interface の略です。これらはまとめて REST API を指します。REST API は、REST アーキテクチャ上の 2 つのソフトウェア システム間で要求と応答を転送するサービスです。

REST アーキテクチャは、4 つの要求動詞 (POST、GET、PUT、および DELETE) のいずれかを使用して、URL からアクセスできる Web サービスを構築します。したがって、REST API は、URL を介してリソースを作成、読み取り、更新、および削除できるソフトウェアであると言えます。

Spring Boot を使用して REST API を作成する方法を学習できます。

Spring Boot アプリケーションの初期化

最初にすべきことは、Spring の基本を理解し、Spring Boot アプリケーションをセットアップすることです。ただし、依存関係を変更する必要があります。Web 依存関係に加えて、Spring Data Java Persistent API (JPA) 依存関係と、使用する予定のデータベースのドライバーを取得する必要があります (このアプリケーションは MySQL を使用します)。

この REST API には、コントローラー、モデル、およびリポジトリーが必要です。したがって、REST API のファイル構造は次のようになります。

REST API ファイル構造

モデルの作成

最初に作成する必要があるクラスは、データ ロジックを格納する顧客モデルです。

package com.onlineshopaholics.api.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Table(name="customer")
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name="customername")
    private String name;

    private String email;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

上記の顧客クラスから、各顧客が ID、名前、および電子メールを持っていることがわかります。また、さまざまな目的に役立ついくつかの注釈にも気付くでしょう。

  • @Entity: 顧客クラスを JPA エンティティとして宣言します。これは、JPA がクラスのフィールドを使用して、リレーショナル データベースに列を作成することを意味します。
  • @Table: 顧客モデル クラスにマップされるテーブルの名前を指定します。
  • @Id: データベース内のエンティティを一意に識別するプロパティを指定します。
  • @GeneratedValue および @GenerationType: これらは連携して、関連付けられているフィールドの自動生成戦略を指定します。したがって、id フィールドは、新しい顧客を作成するたびに一意の値を自動的に生成します。
  • @Column: データベースの列にマップするプロパティを指定します。そのため、name プロパティはデータベースの customername 列にマップされます。

リポジトリの作成

このリポジトリを使用すると、データベース内の顧客データを操作できます。

package com.onlineshopaholics.api.repository;

import org.springframework.data.repository.CrudRepository;
import com.onlineshopaholics.api.model.Customer;

public interface CustomerRepository extends CrudRepository<Customer, Integer>{}

カスタマー リポジトリは、Spring の CrudRepositoy<T,ID>インターフェースを拡張し、エンティティの一意の識別子の型である Integer と共に Customer モデル クラスを渡します。

CrudRepository インターフェースは、REST API に必要な汎用 CRUD メソッドを含む、10 を超える操作へのアクセスを提供します。したがって、必要なメソッドは CrudRepository で既に定義されているため、CustomerRepository インターフェイスで明示的に宣言する必要はありません。

コントローラーの作成

コントローラーを使用すると、モデルとリポジトリーを使用してデータベース内のデータを更新できます。

package com.onlineshopaholics.api.controller;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.onlineshopaholics.api.model.Customer;
import com.onlineshopaholics.api.repository.CustomerRepository;

@RestController
@RequestMapping("/customers")
public class CustomerController {
    @Autowired
    private CustomerRepository customerRepository;

    // create new customer
    @PostMapping("/add")
    public Customer addNewCustomer(@RequestBody Customer newCustomer){
        Customer user = new Customer();
        user.setName(newCustomer.getName());
        user.setEmail(newCustomer.getEmail());
        customerRepository.save(user);
        return user;
    }

    // view all customers
    @GetMapping("view/all")
    public @ResponseBody Iterable<Customer> getAllCustomers(){
        return customerRepository.findAll();
    }

    // view specific customer
    @GetMapping("view/{id}")
    public Optional<Customer> getCustomer(@PathVariable Integer id) {
        return customerRepository.findById(id);
    }

    // update an existing customer
    @PutMapping("/edit/{id}")
    public String update(@RequestBody Customer updateCustomer, @PathVariable Integer id) {
        return customerRepository.findById(id)
                 .map(customer -> {
                       customer.setName(updateCustomer.getName());
                       customer.setEmail(updateCustomer.getEmail());
                       customerRepository.save(customer);
                       return "Customer details have been successfully updated!";
                 }).orElseGet(() -> {
                       return "This customer doesn't exist";
                 });
    }

    // delete customer
    @DeleteMapping("delete/{id}")
    public String delete(@PathVariable("id")Integer id) {
        customerRepository.deleteById(id);
        return "Customer has been successfully deleted!";
    }
}

上記のコントローラーは、5 つの CrudRepository<T,ID> インターフェイス メソッド (それぞれが特定のメソッドに割り当てられている) を使用して、REST API に CRUD 操作を装備します。コントローラーは、その機能を実行できるようにするいくつかの重要な Spring アノテーションも使用します。

  • @RestController: このアノテーションには 2 つの目的があります。これは、コンポーネント スキャンによる検出用のクラスをマークします。また、このクラスのすべてのメソッドの戻り値を応答本文に書き込むように Spring に指示します。
  • @RequestMapping: コントローラーが処理するベースライン リクエスト パターンを定義します。したがって、このコントローラーは「/customers」へのすべてのリクエストを処理します。
  • @ResponseBody: メソッドがエンティティ全体を返すことを許可します。
  • @RequestBody: リクエストボディをオブジェクトに変換できます。
  • @RequestParam: オブジェクトから 1 つのプロパティを分離できます。
  • @PathVariable: リクエスト値をプレースホルダーにマップできます。delete メソッドに指定された ID をデータベース内の既存の値にマップします。
  • @PostMapping: リソースを作成できます。
  • @GetMapping: リソース データを読み取ることができます。
  • @PutMapping: リソースを更新できます。
  • @DeleteMapping: リソースを削除できます。

データベースをアプリケーションに接続する

データベースを任意の Spring アプリケーションに接続するには、resources フォルダーの下にあるapplication.propertiesファイルを使用する必要があります。このファイルは最初は空なので、使用するデータベースの適切なプロパティを設定できます。このアプリケーションは MySQL データベースを使用するため、application.properties ファイルには次のデータが含まれます。

spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/onlineshopaholics
spring.datasource.username=root
spring.datasource.password=securepw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

上記のデータは、このアプリケーションが「root」ユーザー名と「securepw」パスワードを使用して、onlineshopaholics と呼ばれる MySQL データベースに接続することを示しています。次のステップは、MySQL でデータベースと顧客テーブルを作成することです。

リクエストの作成

REST API のテストに使用できるツールは多数あります。Postman は一般的な REST API テスト ツールであり、これを使用して、作成した単純な API をテストできます。MySQL テーブルを作成して Spring アプリケーションを実行したら、Postman を起動して 4 つのリクエスト動詞を試すことができます。

POSTリクエスト

このリクエストにより、REST API を使用して新しい顧客を作成できます。このリクエストを完了するには、投稿リクエストのヘッダー セクションに移動し、新しいヘッダー (Content-Type) を作成する必要があります。JSON を使用して新しい顧客を作成するため、このヘッダーの値を application/json に設定する必要があります。

REST API ポスト ヘッダー

リクエストの本文で、タイプを raw に変更し、JSON を挿入する必要があります。次に、投稿の URL を挿入する必要があります。

REST API 投稿本文

リクエストを送信すると、次のレスポンスが返されます。

REST API ポスト レスポンス

リクエストが成功し、新しい顧客にも ID があることがわかります。

GETリクエスト

これで顧客ができたので、すべての顧客を返す get リクエストでそれを表示できます。

REST API 取得応答

または、各顧客の ID:

REST API ID 応答による取得

PUT リクエスト

Janet を新しい姓と電子メールで更新できます。

REST API put 応答

削除リクエスト

データベースから Janet を削除することもできます。

REST API 削除応答

JUnit を使用して Spring REST API をテストする

Spring Boot を使用すると、Spring のテスト ファイルを使用して任意のアプリケーション (REST API を含む) をテストできます。ソフトウェアのテストは Spring Boot にとって重要です。初期化された各 Spring アプリケーションは、テストに JUnit を使用し、REST API にリクエストを送信できるようにします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です