/ / Cách tạo API REST với Spring Boot

Cách tạo API REST với Spring Boot

Từ viết tắt REST là viết tắt của Chuyển giao trạng thái đại diện, trong khi API là viết tắt của Giao diện lập trình ứng dụng. Cùng nhau, chúng đề cập đến API REST. API REST là một dịch vụ chuyển các yêu cầu và phản hồi giữa hai hệ thống phần mềm, trên kiến ​​trúc REST.


Kiến trúc REST xây dựng các dịch vụ web có thể truy cập thông qua các URL bằng cách sử dụng một trong bốn động từ yêu cầu: POST, GET, PUT và DELETE. Vì vậy, bạn có thể nói API REST là phần mềm cho phép bạn tạo, đọc, cập nhật và xóa tài nguyên thông qua URL.

Bạn có thể tìm hiểu cách tạo API REST bằng Spring Boot.


Khởi tạo ứng dụng khởi động mùa xuân

Điều đầu tiên bạn nên làm là tự làm quen với những kiến ​​thức cơ bản về Spring và thiết lập ứng dụng Spring Boot. Tuy nhiên, bạn sẽ cần phải thay đổi các phụ thuộc. Ngoài phụ thuộc web, bạn sẽ cần có phụ thuộc Spring Data Java Persistent API (JPA) và trình điều khiển cho cơ sở dữ liệu bạn định sử dụng (ứng dụng này sẽ sử dụng MySQL).

Đối với API REST này, bạn sẽ cần một bộ điều khiển, một mô hình và một kho lưu trữ. Vì vậy, API REST sẽ có cấu trúc tệp sau:

Cấu trúc tệp API REST

Tạo mô hình

Lớp đầu tiên bạn cần tạo là mô hình khách hàng, lưu trữ logic dữ liệu.

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

Từ lớp khách hàng ở trên, bạn sẽ thấy rằng mỗi khách hàng sẽ có một id, tên và email. Bạn cũng sẽ nhận thấy một số chú thích phục vụ các mục đích khác nhau.

  • @Entity: Khai báo lớp khách hàng dưới dạng thực thể JPA. Điều này có nghĩa là JPA sẽ sử dụng các trường trong lớp để tạo các cột trong cơ sở dữ liệu quan hệ.
  • @Table: Chỉ định tên của bảng sẽ ánh xạ tới lớp mô hình khách hàng.
  • @Id: Chỉ định một thuộc tính sẽ xác định duy nhất thực thể trong cơ sở dữ liệu.
  • @GeneratedValue và @GenerationType: Chúng hoạt động cùng nhau để chỉ định chiến lược tự động tạo cho trường mà nó liên kết. Vì vậy, trường id sẽ tự động tạo ra một giá trị duy nhất mỗi khi bạn tạo một khách hàng mới.
  • @Column: Chỉ định một thuộc tính ánh xạ tới một cột trong cơ sở dữ liệu. Vì vậy, thuộc tính tên sẽ ánh xạ tới cột tên khách hàng trong cơ sở dữ liệu.

Tạo kho lưu trữ

Kho lưu trữ này sẽ cho phép bạn tương tác với dữ liệu khách hàng trong cơ sở dữ liệu.

 package com.onlineshopaholics.api.repository;

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

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

Kho lưu trữ khách hàng mở rộng giao diện CrudRepositoy của Spring, chuyển cho nó lớp mô hình Khách hàng cùng với loại mã định danh duy nhất cho thực thể, Số nguyên.

Giao diện CrudRepository cung cấp quyền truy cập vào hơn 10 thao tác, bao gồm các phương thức CRUD chung mà bạn sẽ cần cho API REST. Vì vậy, vì CrudRepository đã xác định các phương thức bạn sẽ cần, nên không cần phải khai báo rõ ràng chúng trong giao diện Kho lưu trữ khách hàng.

Tạo bộ điều khiển

Bộ điều khiển cho phép bạn cập nhật dữ liệu trong cơ sở dữ liệu của mình bằng mô hình và kho lưu trữ.

 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;

    
    @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;
    }

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

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

    
    @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";
                 });
    }

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

Bộ điều khiển ở trên trang bị API REST với các thao tác CRUD, bằng cách sử dụng năm phương thức giao diện CrudRepository (mỗi phương thức được gán cho một phương thức cụ thể). Bộ điều khiển cũng sử dụng một số chú thích quan trọng của Spring cho phép nó thực hiện các chức năng của mình.

  • @RestController: Chú thích này phục vụ hai mục đích. Nó đánh dấu một lớp để khám phá bằng cách quét thành phần. Nó cũng yêu cầu Spring viết giá trị trả về cho tất cả các phương thức, trong lớp này, trong phần thân phản hồi.
  • @RequestMapping: Xác định mẫu yêu cầu cơ sở mà bộ điều khiển sẽ xử lý. Vì vậy, bộ điều khiển này sẽ xử lý tất cả các yêu cầu tới “/customers”.
  • @ResponseBody: Cho phép phương thức trả về toàn bộ thực thể.
  • @RequestBody: Cho phép bạn chuyển đổi nội dung yêu cầu thành một đối tượng.
  • @RequestParam: Cho phép bạn tách biệt một thuộc tính khỏi một đối tượng.
  • @PathVariable: Cho phép bạn ánh xạ giá trị yêu cầu tới trình giữ chỗ. Nó ánh xạ ID được cung cấp cho phương thức xóa với một giá trị hiện có trong cơ sở dữ liệu.
  • @PostMapping: Cho phép bạn tạo tài nguyên.
  • @GetMapping: Cho phép bạn đọc dữ liệu tài nguyên.
  • @PutMapping: Cho phép bạn cập nhật tài nguyên.
  • @DeleteMapping: Cho phép bạn xóa tài nguyên.

Kết nối cơ sở dữ liệu với ứng dụng của bạn

Để kết nối cơ sở dữ liệu với bất kỳ ứng dụng Spring nào, bạn sẽ cần sử dụng ứng dụng.properties tập tin trong thư mục tài nguyên. Tệp này ban đầu trống, vì vậy bạn có thể điền vào tệp các thuộc tính thích hợp cho cơ sở dữ liệu mà bạn định sử dụng. Ứng dụng này sẽ sử dụng cơ sở dữ liệu MySQL, vì vậy tệp application.properties sẽ chứa dữ liệu sau:

 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

Dữ liệu ở trên cho thấy ứng dụng này sẽ kết nối với cơ sở dữ liệu MySQL có tên là onlineshopaholics, với tên người dùng “root” và “securepw” làm mật khẩu. Bước tiếp theo của bạn là tạo cơ sở dữ liệu và bảng khách hàng trong MySQL.

Tạo yêu cầu

Có nhiều công cụ mà bạn có thể sử dụng để kiểm tra API REST của mình. Postman là một công cụ kiểm tra API REST phổ biến và bạn có thể sử dụng nó để kiểm tra API đơn giản mà bạn đã tạo. Sau khi tạo bảng MySQL và chạy ứng dụng Spring, bạn có thể khởi chạy Postman và thử nghiệm với bốn động từ yêu cầu.

ĐĂNG Yêu cầu

Yêu cầu này sẽ cho phép bạn tạo khách hàng mới bằng API REST. Để hoàn thành yêu cầu này, bạn cần đi tới phần tiêu đề của yêu cầu bài đăng của mình và tạo tiêu đề mới (Loại nội dung). Bạn nên đặt giá trị của tiêu đề này thành application/json, vì bạn sẽ tạo khách hàng mới bằng JSON.

Tiêu đề bài đăng API REST

Trong phần nội dung của yêu cầu, bạn cần thay đổi loại thành raw và chèn JSON của mình. Sau đó, bạn sẽ cần chèn URL bài đăng:

Nội dung bài đăng API REST

Gửi yêu cầu sẽ trả lại phản hồi sau:

Phản hồi bài đăng API REST

Bạn có thể thấy rằng yêu cầu đã thành công và khách hàng mới cũng có id.

NHẬN yêu cầu

Bây giờ bạn đã có một khách hàng, bạn có thể xem nó với yêu cầu get trả về tất cả các khách hàng:

API REST nhận phản hồi

Hoặc từng khách hàng theo id:

API REST nhận theo phản hồi ID

Yêu cầu ĐẶT

Bạn có thể cập nhật họ và email mới cho Janet.

API REST đặt phản hồi

Xóa yêu cầu

Bạn cũng có thể xóa Janet khỏi cơ sở dữ liệu.

Phản hồi xóa API REST

Kiểm tra API Spring REST của bạn bằng JUnit

Với Spring Boot, bạn có thể kiểm tra bất kỳ ứng dụng nào (bao gồm cả API REST) ​​bằng tệp thử nghiệm của Spring. Kiểm thử phần mềm rất quan trọng đối với Spring Boot. Mỗi ứng dụng Spring được khởi tạo sử dụng JUnit để thử nghiệm và cho phép bạn gửi yêu cầu tới các API REST của mình.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *