
如何快速实现REST API集成以优化业务流程
我已经使用 Twilio 的 REST API 一段时间了。对于如何通过 HTTP 在客户端和服务器之间建立通信来使用 REST API,我一直感到惊叹。你调用一个 API,该 API 再调用服务器。随后,服务器执行全部业务逻辑并返回结果。
我一直好奇这些 API 是如何开发的,以便我也能够创建自己的 API。这驱使我探索了各种框架,比如 Java 的 Spring Boot。在利用 Spring Boot 开发了一些 REST API 后,我决定撰写这个教程来帮助初学者入门 Spring Boot。
在本教程中,你将在 Spring Boot 中开发 REST API,以对员工数据库执行 CRUD(创建、读取、更新、删除)操作。
Spring Boot 是一个基于 Spring 的 Java 框架,专门用于开发 Web 应用程序。它使得创建 REST API 变得简单快捷,且几乎无需复杂配置。使用 Spring Boot 开发 REST API 的几大优势包括:
总的来说,Spring Boot 是开发人员构建应用程序的理想选择,因为它提供了所有必要的样板配置,让开发者能够立即着手编码。
要创建 Spring Boot 应用程序,您将使用名为 Spring Initializr 的工具。该工具提供了 Spring Boot 项目的基本结构,帮助您快速上手。
请访问 Spring Initializr 网站。在“Project”(项目)选项下,选择“Maven”作为构建工具,并选择“Java”作为编程语言。请注意,本教程是基于 Spring Boot 版本 2.5.6 的,因此在 Spring Initializr 中也请选择相同的版本。
在项目的“Project Metadata”(项目元数据)部分,填写以下信息:
选择“Jar”作为打包类型,因为应用程序将在 Spring Boot 提供的嵌入式 Tomcat 服务器中运行。
本教程使用 Java 8 编写,因此您可以选择相同的 Java 版本来遵循本教程。
接下来,将以下依赖项添加到项目中:
配置完成后,您的 Spring Boot 应用程序应类似于以下结构。
点击屏幕底部的“Generate”(生成)按钮。这将下载一个包含项目模板的 zip 文件。将 zip 文件解压到您选择的文件夹中。
打开 Eclipse IDE,转到“File”(文件)菜单并选择“Import”(导入)。在“Maven”下,选择“Existing Maven Projects”(现有 Maven 项目)。点击“Next”(下一步)。
浏览解压后的 zip 文件目录,选择包含 pom.xml 文件的根文件夹。点击“Finish”(完成)将项目导入到 Eclipse IDE 中。
在文件资源管理器中,您将会看到以下文件夹:
src/main/java/com/example/employee
子目录包含了本教程中所有的 Java 类。application.properties
文件包含了 Spring Boot 用来配置应用程序的属性。在本教程的后续部分,您将会向此文件中添加数据库配置的详细信息,例如数据库 URL、用户名和密码。pom.xml
文件列出了您在 Spring Initializr 中创建 Spring Boot 项目时所添加的所有依赖项。请注意,有一个名为 EmployeeApplication.java
的文件,这是启动 Spring Boot 应用程序的入口点。
这个文件包含了以下 Spring Boot 注解的功能:
@EnableAutoConfiguration
:这将启用 Spring Boot 的自动配置功能,该功能会根据项目中的类路径设置、各种属性设置和其他因素来自动配置您的 Spring 应用程序。@Configuration
:它表明该类使用了 Spring 基于 Java 的配置。在配置类中,您可以定义应用程序正在使用的所有 bean。Spring Boot 将在运行时使用这些 bean 定义来实例化它们。@ComponentScan
:它告诉 Spring 在哪些包中查找其他组件、配置和服务,允许 Spring Boot 自动发现和注册这些组件作为 bean。在本例中,它将扫描与 EmployeeApplication
类相同的包及其子包中的组件。我们首先需要了解Spring Boot应用程序的主要结构层。以下是为项目中的每个结构层创建子包的步骤:
要为上述组件创建单独的包,请在Eclipse中右键点击com.example.employee
包,然后选择New
,接着选择Package
。在弹出的新窗口中,在Name
字段输入com.example.employee.repository
,然后点击Finish
。
这将为存储库组件创建一个文件夹。请对以下软件包重复上述步骤:
在为每个子包中的应用程序编写代码之前,让我们在Spring Boot中创建表并配置MySQL连接详细信息,这些信息将在本教程中使用。
打开 MySQL Workbench。在主页中,单击 MySQL 连接旁边的 [+] 图标。
此时将打开 Setup New Connection 弹出窗口。输入 “spring-boot-test” 作为连接名称。在 Default Schema (默认架构) 中,输入 “employee-schema”。
点击 OK。将在主页上创建新的 MySQL 连接。
要打开连接,请点击主页上的“spring-boot-test”。在“employee-schema”下,右键点击“Tables”并选择“Create Table”。
添加四列:emp_id、first_name、last_name、email_id。对于emp_id,请勾选“Primary Key”、“Not Null”和“Auto Increment”选项。您的表格应该类似于下图所示:
点击“Apply”然后点击“Finish”。
要在应用程序中连接到这个MySQL实例,必须向Spring Boot提供数据库的详细信息。打开application.properties
文件,并添加以下内容:
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/employee-schema
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
MySQL5InnoDBDialect
是一个方言,用于通知Spring Boot正在使用的数据库类型。基于这个信息,Spring Boot将为该特定数据库生成相应的SQL查询。有了这些配置信息,Spring Boot将自动为你配置数据库连接。
现在,表已经准备就绪,我们可以开始为应用程序的各个层添加代码。
返回到Eclipse IDE,右键点击com.example.employee.model
包,选择创建新类的选项。
将会出现一个包含类详细信息的新弹出窗口。在“Name”(名称)字段中,输入“Employee”。点击“Finish”。复制再试一次分享
将内容添加到文件中:
package com.example.employee.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 = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="emp_id")
private Long id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email_id")
private String emailId;
}
让我们分解文件中的代码:
@Entity
注解指定这个 Java 类映射到数据库中的一个表。@Table
注解在属性 name
的帮助下指定这个类映射到哪个具体的表。@Column
注解允许定义一组属性,比如名称、长度等。name
属性将是该实例变量映射到的数据库表中的字段名称。@Id
告诉 Spring Boot 这个特定的字段是表中的主键。@GeneratedValue
指定将用于生成主键的策略。有四种主要的主键生成策略,如下所述:
GenerationType.AUTO
– 这是 Spring Boot 使用的默认策略。如果您使用此策略,JPA 提供者将根据 application.properties
文件中给出的方言决定适当的策略来生成主键。GenerationType.IDENTITY
– 该策略使用数据库标识列来确定主键策略。例如,在创建 employee 表时,您将 emp_id 列定义为数据库中的自动递增列。现在,当您使用此策略时,将从1开始生成唯一主键,并在每次向表中插入新行时递增。GenerationType.SEQUENCE
– 此策略使用数据库序列生成主键。GenerationType.TABLE
– 此策略使用数据库表生成主键。此外,你将为上述实例变量创建 setter 和 getter 方法。在 Eclipse 中自动生成这些方法,请右键单击 Employee.java
文件并选择 Source
(源)。选择 Generate Getters and Setters
(生成 Getter 和 Setter)。点击 Select All
,然后点击 Generate
按钮。
在下一节中,您将创建存储库类,该类将使用此模型类从数据库中访问员工详细信息。
在 com.example.employee.repository 包下创建一个名为 EmployeeRepository 的类,并将代码替换为以下内容:
package com.example.employee.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.employee.model.Employee;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
@Repository
注解表明该类是一个数据仓库,负责包含 CRUD(创建、读取、更新、删除)操作。CRUD 是数据库操作的四个基本功能。
EmployeeRepository
扩展了 JpaRepository
接口。在将 JpaRepository
应用于您的存储库时,您需要传递两个参数:第一个是您希望该存储库管理的模型类的类型,第二个是主键的数据类型。
Spring Data JPA 提供的 JpaRepository
接口使仓库类能够检索、更新和删除 employee
表中的记录。
该接口定义了一系列方法,如 save()
、findAll()
和 delete()
,用于对数据库执行操作。这些方法的实现由名为 SimpleJpaRepository
的默认实现类提供。通过调用这些方法,您可以避免为这些基本操作编写自定义查询。
在下一节中,您将创建一个服务类,该类将调用 JpaRepository
实现中的方法。
服务组件包含了业务逻辑。在 com.example.employee.service
包下,创建一个名为 EmployeeService
的类,并将以下代码填入其中:
package com.example.employee.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.employee.model.Employee;
import com.example.employee.repository.EmployeeRepository;
import java.util.List;
@Service
public class EmployeeService {
@Autowired
EmployeeRepository empRepository;
}
在Spring框架中,@Autowired
注解被用来实例化类对象,实现依赖注入。
当一个类被@Repository
、@Component
等注解标记时,Spring就有能力为这个类创建一个Bean。随后,在其他需要使用这个Bean的类中,可以通过@Autowired
注解来自动注入这个Bean。这个过程被称为Spring中的依赖注入。此外,@ComponentScan
注解允许Spring在指定的包中查找并注册这些被注解标记的类作为Bean。
现在,我们将在服务层中创建一些方法。这些方法会调用EmployeeRepository
中的方法,而EmployeeRepository
是JpaRepository
的一个扩展。
接下来,您需要在EmployeeService
类中的EmployeeRepository empRepository
成员变量之后,添加以下这些方法:
// CREATE
public Employee createEmployee(Employee emp) {
return empRepository.save(emp);
}
// READ
public List<Employee> getEmployees() {
return empRepository.findAll();
}
// DELETE
public void deleteEmployee(Long empId) {
empRepository.deleteById(empId);
}
createEmployee
方法调用 empRepository.save()
函数,该函数在保存到数据库后会返回 Employee
对象。传递给 createEmployee
方法的参数是一个包含所有要保存细节的 Employee
模型。
类似地,getEmployees()
和 deleteEmployee()
分别调用了由 Repository
扩展的 JpaRepository
方法。
getEmployees()
函数的作用是返回数据库中所有员工的详细信息。deleteEmployee()
函数将删除表中 emp_id
等于传递的 employee
记录的行,使用的是 deleteById(empId)
方法。要更新员工详细信息,请在deleteEmployee(Long empId)
方法后添加以下函数:
// UPDATE
public Employee updateEmployee(Long empId, Employee employeeDetails) {
Employee emp = empRepository.findById(empId).get();
emp.setFirstName(employeeDetails.getFirstName());
emp.setLastName(employeeDetails.getLastName());
emp.setEmailId(employeeDetails.getEmailId());
return empRepository.save(emp);
}
让我们来分解上述的 updateEmployee
方法:
updateEmployee
方法接受两个参数——雇员ID(主键)和包含新雇员详细信息的雇员对象。empId
的员工对象,并将其存储在变量 emp
中。employee
对象之后,您将使用在 Employee.java
中定义的 setter 方法来使用存储在 employeeDetails
中的新值更新字段。empRespository.save(emp)
函数将更新后的 emp
对象保存到数据库。在com.example.employee.controller包下创建一个名为EaseController的类,并将代码替换为以下内容:
package com.example.employee.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.employee.model.Employee;
import com.example.employee.service.EmployeeService;
@RestController
@RequestMapping("/api")
public class EmployeeController {
@Autowired
EmployeeService empService;
}
@RequestMapping
注解定义了在此控制器中创建的所有 REST API 的基础 URL。这个基础 URL 后面会跟上为每个控制器方法提供的具体 REST 端点。
@RestController
注解在类级别上是以下两个注解的组合:
@Controller
:告诉 Spring Boot 这个类是一个控制器,负责处理 HTTP 请求。@ResponseBody
:表示该控制器内的方法的返回值将直接作为 REST API 的响应体返回,而不是解析为视图名或执行其他跳转。EmployeeService
是通过 @Autowired
注解实现依赖注入的,这样它就可以在控制器中被使用了。
在进一步实现控制器中的 REST API 请求之前,我们先来概述一下这些 REST API 的基本结构:
为了创建一个新的雇员记录,我们需要定义一个 POST 方法,其访问的端点为 api/employees
。这个 POST 请求的请求体将包含从客户端发送到 API 的数据,这些数据代表要保存到数据库中的新员工信息。这些数据通常以 JSON 格式发送,其结构可能类似于以下示例:
{
"firstName": "Joe",
"lastName": "B",
"emailId": "example@gmail.com"
}
要获取员工的详细信息,我们需要使用端点 api/employees
并定义一个 GET 方法。
要更新员工的详细信息,我们可以使用端点 api/employees/{empId}
并创建一个 PUT HTTP 方法。其中,{empId}
是一个路径参数,代表要更新的员工的 ID。在发送到 API 的请求体中,我们需要包含更新后的员工详细信息,其格式通常如下所示:
{
"firstName": "Joe",
"lastName": "B",
"emailId": "newemail@gmail.com"
}
要删除一个员工,需要创建一个HTTP方法,使用端点 /emp/{empId}
,其中 {empId}
是要删除其数据的员工ID。
让我们为这四个REST API创建方法。将以下方法添加到 siteService
和 empService
之后的 siteController
类中:
@RequestMapping(value="/employees", method=RequestMethod.POST)
public Employee createEmployee(@RequestBody Employee emp) {
return empService.createEmployee(emp);
}
让我们分解一下新添加的代码:
value
– 这是端点。在你的情况下,是 /employees
。请注意,value
字段中给出的端点仅为 /employees
,而不是 /API/employees
。由于 /API
对于所有端点都是通用的,因此将其作为基URL添加到类的 @RequestMapping
注解中。method
– 这是由枚举表示的HTTP方法类型。对于创建员工端点,HTTP方法是 POST。因此,您将添加 RequestMethod.POST
作为其值。@RequestBody
注解用于将端点的请求体映射到方法参数。emp
将包含传递给此端点的请求JSON。类似地,您将为所有其他REST API添加代码。将这些方法添加到 CableController
类的 createEmployee
方法之后:
@RequestMapping(value="/employees", method=RequestMethod.GET)
public List<Employee> readEmployees() {
return empService.getEmployees();
}
@RequestMapping(value="/employees/{empId}", method=RequestMethod.PUT)
public Employee readEmployees(@PathVariable(value = "empId") Long id, @RequestBody Employee empDetails) {
return empService.updateEmployee(id, empDetails);
}
@RequestMapping(value="/employees/{empId}", method=RequestMethod.DELETE)
public void deleteEmployees(@PathVariable(value = "empId") Long id) {
empService.deleteEmployee(id);
}
请注意,有些方法使用了@PathVariable
注解,这表示REST API端点包含了一个路径参数。@PathVariable
注解会将端点URL中指定的路径变量值映射到Java方法的对应参数上。
在正式开始构建之前,您可以参考以下GitHub存储库作为参考。
在Eclipse的Project Explorer中,右键点击employee
项目文件夹,选择“Run As”,然后再选择“Maven build…”来运行构建过程。
此时将打开 Edit Configuration 弹出窗口。在 Goals 中键入 spring-boot:run。
转到 Environment 选项卡,然后单击 Add。将打开 New Environment Variable (新建环境变量) 弹出窗口。
在 Name 字段中,输入 “spring.datasource.username”。对于 Value (值),输入您的 MySQL 用户名。单击 OK。
同样,添加一个新的环境变量,在 Name 中为 “spring.datasource.password”,在 Value 中加入你的 MySQL 密码。单击 Apply (应用),然后单击 Run(运行)。
应用程序现在将开始构建。成功的构建将在控制台上显示以下内容:
如果您查看控制台上的最后几行输出,它会显示应用程序已经在默认的8080端口上开始运行。如果这个端口被占用,Spring Boot会自动寻找并使用其他可用的端口。
当您在浏览器中访问https://localhost:8080
时,可能会看到一个默认的“Whitelabel Error Page”,这是因为还没有配置任何特定的首页或路由。
接下来,您将学习如何测试四个CRUD(创建、读取、更新、删除)API。
Postman是一个流行的应用程序,它可以帮助您开发、测试和记录API。如果您还没有创建Postman的免费账户,建议您注册一个。
在Postman中,您可以创建一个工作区,这个工作区可以用于与团队成员一起协作处理项目。每个工作区可以包含一个或多个集合,集合就像是一个包含了多个API定义的文件夹。
以下是在Postman中创建工作区的步骤:
要创建收藏集,请单击左侧面板中的 Create new Collection 图标。
单击产品系列名称旁边的 Edit(编辑)图标,然后输入您的 “Employee collection(员工产品系列)”。
接下来,您将在集合中为在 Spring Boot 应用程序中创建的四个 REST API 中的每一个创建和测试请求。
在左侧面板中,单击 View more actions (查看您创建的集合的更多操作),然后选择 Add request(添加请求)。
将请求名称指定为 “Create Employee”。将创建一个新请求,如下所示:
将 HTTP 方法更改为 POST。
在 Enter Request URL (输入请求 URL) 字段中,输入 “https://localhost:8080/api/employees”。
端点 /API/employees
前面是应用程序运行的服务器和端口。如果您的应用程序在不同的端口上运行,请替换URL中的8080。
要将请求正文发送到这个请求URL终端节点,请转到“Body”(正文)选项卡,并勾选“JSON”作为请求正文格式的原始复选框。
在提供的文本框中输入以下数据:
{
"firstName":"Nida",
"lastName":"Khan",
"emailId":"example1@gmail.com"
}
以下是将要添加到数据库中的员工详细信息。请点击保存,然后发送请求。以下是在Postman中您可能会收到的回复:
{
"id": 1,
"firstName": "Nida",
"lastName": "Khan",
"emailId": "example1@gmail.com"
}
请注意200 OK响应状态,并且响应主体是一个JSON,其中包含了保存在数据库中的员工记录的详细信息。
转到MySQL,并通过执行查询来验证是否使用上述员工详细信息创建了一个新行,其中包含emp_id=1
:
SELECT * FROM employee;
同样地,您也需要创建并运行针对员工的 GET、DELETE 和 UPDATE 请求。
对于获取员工信息的 GET 请求,请在请求 URL 字段中输入 http://localhost:8080/api/employees
。无需填写请求体,直接点击发送即可。
要更新具有特定ID的员工信息,请创建一个PUT请求。在输入请求URL字段中输入 http://localhost:8080/api/webs/1
。在原始JSON正文中输入以下详细信息,然后点击发送:
{
"firstName": "Nida",
"lastName": "K",
"emailId": "example2@gmail.com"
}
为员工记录创建一个请求。在“Enter Request URL”(输入请求 URL)字段中,输入DELETE http://localhost:8080/api/employees/1
。请求体保持为空,然后点击“Send”(发送)。
通过本教程,您已经学习了如何利用 Spring Boot 来构建 REST API,并且掌握了在 Postman 中对这些 API 进行测试的方法。
接下来,通过查看这些文章并在 Spring Boot 应用程序中实现 Twilio API 来挑战自己:
原文链接:https://www.twilio.com/en-us/blog/create-rest-apis-java-spring-boot