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.
Mục Lục
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:
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
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
- @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.
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:
Gửi yêu cầu sẽ trả lại phản hồi sau:
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:
Hoặc từng khách hàng theo id:
Yêu cầu ĐẶT
Bạn có thể cập nhật họ và email mới cho Janet.
Xóa yêu cầu
Bạn cũng có thể xóa Janet khỏi cơ sở dữ liệu.
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.