如何使用 Spring Boot 創建 REST API
首字母縮略詞 REST 代表 REpresentational State Transfer,而 API 代表應用程序編程接口。它們一起指的是 REST API。REST API 是一種在 REST 架構上在兩個軟件系統之間傳輸請求和響應的服務。
REST 架構構建可通過 URL 使用四個請求動詞之一訪問的 Web 服務:POST、GET、PUT 和 DELETE。因此,您可以說 REST API 是允許您通過 URL 創建、讀取、更新和刪除資源的軟件。
您可以了解如何使用 Spring Boot 創建 REST API。
初始化 Spring Boot 應用程序
您應該做的第一件事是熟悉 Spring 的基礎知識並設置 Spring Boot 應用程序。不過,您需要更改依賴項。除了 Web 依賴項之外,您還需要獲取 Spring Data Java Persistent API (JPA) 依賴項,以及您打算使用的數據庫的驅動程序(此應用程序將使用 MySQL)。
對於此 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>接口,將 Customer 模型類以及實體的唯一標識符類型 Integer 傳遞給它。
CrudRepository 接口提供對 10 多個操作的訪問,包括 REST API 所需的通用 CRUD 方法。因此,由於 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!";
}
}
上面的控制器通過使用五個 CrudRepository<T,ID> 接口方法(每個分配給特定方法)為 REST API 配備 CRUD 操作。控制器還使用了幾個重要的 Spring 註釋,允許它執行其功能。
- @RestController:這個註解有兩個目的。它標記一個類以通過組件掃描發現。它還告訴 Spring 在響應主體中寫入此類中所有方法的返回值。
- @RequestMapping:定義控制器將處理的基線請求模式。因此,該控制器將處理對“/customers”的所有請求。
- @ResponseBody:允許方法返回整個實體。
- @RequestBody:允許您將請求主體轉換為對象。
- @RequestParam:允許你從一個對像中分離出一個屬性。
- @PathVariable:允許您將請求值映射到佔位符。它將提供給 delete 方法的 ID 映射到數據庫中的現有值。
- @PostMapping:允許您創建資源。
- @GetMapping:允許您讀取資源數據。
- @PutMapping:允許您更新資源。
- @DeleteMapping:允許您刪除資源。
將數據庫連接到您的應用程序
要將數據庫連接到任何 Spring 應用程序,您需要使用資源文件夾下的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
上面的數據顯示此應用程序將連接到一個名為 onlineshopaholics 的 MySQL 數據庫,用戶名為“root”,密碼為“securepw”。下一步是在 MySQL 中創建數據庫和客戶表。
創建請求
您可以使用許多工具來測試 REST API。Postman 是一種流行的 REST API 測試工具,您可以使用它來測試您構建的簡單 API。創建 MySQL 表並運行 Spring 應用程序後,您可以啟動 Postman 並試驗四個請求動詞。
POST請求
此請求將允許您使用 REST API 創建新客戶。要完成此請求,您需要轉到發布請求的標頭部分並創建一個新標頭 (Content-Type)。您應該將此標頭的值設置為 application/json,因為您將使用 JSON 創建新客戶。
在請求正文中,您需要將類型更改為原始類型並插入您的 JSON。然後您需要插入帖子 URL:
發送請求將返回以下響應:
可以看到請求成功了,新客戶也有了id。
獲取請求
現在您有了一個客戶,您可以使用返回所有客戶的 get 請求來查看它:
或者每個客戶的 id:
PUT 請求
您可以使用新的姓氏和電子郵件更新 Janet。
刪除請求
您還可以從數據庫中刪除 Janet。
使用 JUnit 測試你的 Spring REST API
使用 Spring Boot,您可以使用 Spring 的測試文件測試任何應用程序(包括 REST API)。軟件測試對 Spring Boot 很重要。每個初始化的 Spring 應用程序都使用 JUnit 進行測試,並允許您向 REST API 發送請求。
發佈留言