14个文本转图像AI API
如何使用Java和Spring Boot创建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 API 的先决条件
- 具备一定的 Java 知识或愿意学习。
- Java 开发工具包(JDK)版本 8 或更高版本。
- Maven 3.3 版本或更高版本。
- MySQL(MySQL 是你将用于存储员工数据,并通过 REST API 在应用程序中访问的数据库服务。你可以按照指导了解使用 Workbench 设置 MySQL 的详细步骤)。
- Eclipse IDE 用于代码开发(在运行安装程序时,它会要求你选择安装的包,请选择“Eclipse IDE for Java EE Developers”。确保在 Eclipse IDE 中配置了 Maven)。
- Postman 桌面应用程序用于测试 API(在安装过程中,当提示时创建一个免费账户)。
使用 Java Spring Boot 的优势
Spring Boot 是一个基于 Spring 的 Java 框架,专门用于开发 Web 应用程序。它使得创建 REST API 变得简单快捷,且几乎无需复杂配置。使用 Spring Boot 开发 REST API 的几大优势包括:
- 无需繁琐的 XML 配置。
- 内置嵌入式 Tomcat 服务器,便于运行 Spring Boot 应用程序。
- 强大的自动配置功能,能自动为特定依赖项配置应用程序。只要相关依赖项在 Classpath 中可用,Spring Boot 就会自动为其创建 Bean(即由 Spring IoC 容器实例化和管理的对象)。这意味着开发者无需手动创建和配置 Bean,Spring Boot 会代为处理。
总的来说,Spring Boot 是开发人员构建应用程序的理想选择,因为它提供了所有必要的样板配置,让开发者能够立即着手编码。
创建并导入 Spring Boot 项目
要创建 Spring Boot 应用程序,您将使用名为 Spring Initializr 的工具。该工具提供了 Spring Boot 项目的基本结构,帮助您快速上手。
请访问 Spring Initializr 网站。在“Project”(项目)选项下,选择“Maven”作为构建工具,并选择“Java”作为编程语言。请注意,本教程是基于 Spring Boot 版本 2.5.6 的,因此在 Spring Initializr 中也请选择相同的版本。
在项目的“Project Metadata”(项目元数据)部分,填写以下信息:
- Group:这是基础包名,表示正在创建项目的组织或组。它遵循 Java 包命名规范。您可以保留默认值。
- Artifact:这是项目的名称。由于您正在创建一个用于访问和操作员工详细信息的应用程序,因此可以命名为“employee”。
- Name:这是 Spring Boot 在创建项目入口点时将使用的应用程序显示名称。您可以将其与 Artifact 名称“employee”保持一致。
- Description:提供项目的简要描述。
选择“Jar”作为打包类型,因为应用程序将在 Spring Boot 提供的嵌入式 Tomcat 服务器中运行。
本教程使用 Java 8 编写,因此您可以选择相同的 Java 版本来遵循本教程。
接下来,将以下依赖项添加到项目中:
- Spring Web:构建 RESTful Web 应用程序所必需的。
- Spring Data JPA:用于访问数据库中的数据。JPA(Java 持久性 API)是 Java 中的一种规范,用于将 Java 对象映射到数据库中的实体,也称为 ORM(对象关系映射)。Spring Data JPA 是 JPA 的一个抽象层,为数据库操作(如创建、删除和更新记录)提供实用方法,从而避免了编写复杂的 JDBC 查询。
- MySQL Driver:用于连接 MySQL 数据库。
配置完成后,您的 Spring Boot 应用程序应类似于以下结构。
点击屏幕底部的“Generate”(生成)按钮。这将下载一个包含项目模板的 zip 文件。将 zip 文件解压到您选择的文件夹中。
打开 Eclipse IDE,转到“File”(文件)菜单并选择“Import”(导入)。在“Maven”下,选择“Existing Maven Projects”(现有 Maven 项目)。点击“Next”(下一步)。
浏览解压后的 zip 文件目录,选择包含 pom.xml 文件的根文件夹。点击“Finish”(完成)将项目导入到 Eclipse IDE 中。
探索 Spring Boot 中的文件结构
在文件资源管理器中,您将会看到以下文件夹:
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应用程序的主要结构层。以下是为项目中的每个结构层创建子包的步骤:
- DAO(数据访问层):DAO层提供了一个接口,用于连接数据库并访问存储在其中的数据。每个DAO类可以处理检索不同类型实体的查询。
- 存储库层:这一层与DAO层类似,也是用于连接数据库和访问数据。不过,与DAO层相比,存储库层提供了更高的抽象级别。每个类负责访问和操作一个特定的实体。在本教程中,我们将使用存储库层。
- 服务层:服务层调用DAO层来获取数据,并在其上执行业务逻辑。服务层中的业务逻辑可能包括对接收数据的计算、根据某些逻辑对数据进行过滤等。
- 模型层:模型层包含了所有将映射到数据库表的Java对象。DAO层会从数据库中获取数据,并使用这些数据填充相应的模型对象,然后将其返回给服务层,反之亦然。
- 控制器层:这是最顶层,当收到针对特定REST API的请求时会被调用。控制器层处理REST API请求,调用一个或多个服务,并向客户端返回HTTP响应。
要为上述组件创建单独的包,请在Eclipse中右键点击com.example.employee
包,然后选择New
,接着选择Package
。在弹出的新窗口中,在Name
字段输入com.example.employee.repository
,然后点击Finish
。
这将为存储库组件创建一个文件夹。请对以下软件包重复上述步骤:
- com.example.employee.controller
- com.example.employee.model
- com.example.employee.service
在为每个子包中的应用程序编写代码之前,让我们在Spring Boot中创建表并配置MySQL连接详细信息,这些信息将在本教程中使用。
在 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
- 3306是运行MySQL实例的默认端口号。请将其更改为实际运行实例的端口号。
MySQL5InnoDBDialect
是一个方言,用于通知Spring Boot正在使用的数据库类型。基于这个信息,Spring Boot将为该特定数据库生成相应的SQL查询。
有了这些配置信息,Spring Boot将自动为你配置数据库连接。
现在,表已经准备就绪,我们可以开始为应用程序的各个层添加代码。
创建 Java 模型类
返回到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
的帮助下指定这个类映射到哪个具体的表。- 每个 Java 实例变量上的
@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
按钮。
在下一节中,您将创建存储库类,该类将使用此模型类从数据库中访问员工详细信息。
创建 repository 类
在 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
实现中的方法。
创建 service 类
服务组件包含了业务逻辑。在 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(主键)和包含新雇员详细信息的雇员对象。- 要更新现有员工,首先需要检索数据库中员工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
注解实现依赖注入的,这样它就可以在控制器中被使用了。
创建方法以执行 CRUD 操作
在进一步实现控制器中的 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方法的对应参数上。
构建 Spring Boot 应用程序
在正式开始构建之前,您可以参考以下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。
测试 REST API
Postman是一个流行的应用程序,它可以帮助您开发、测试和记录API。如果您还没有创建Postman的免费账户,建议您注册一个。
在Postman中,您可以创建一个工作区,这个工作区可以用于与团队成员一起协作处理项目。每个工作区可以包含一个或多个集合,集合就像是一个包含了多个API定义的文件夹。
以下是在Postman中创建工作区的步骤:
- 打开Postman应用程序。
- 在界面顶部选择“工作区”下拉列表。
- 点击“新建工作区”来创建一个新的工作区。
- 请输入工作区的名称,例如“Spring Boot REST API Workspace”。
- 在“Visibility”(可见性)部分,您可以选择工作区是对团队成员可见还是仅对自己可见。您可以根据本文的需求选择任意一个选项。
- 点击左下角的“Create Workspace”按钮。复制再试一次分享
要创建收藏集,请单击左侧面板中的 Create new Collection 图标。
单击产品系列名称旁边的 Edit(编辑)图标,然后输入您的 “Employee collection(员工产品系列)”。
接下来,您将在集合中为在 Spring Boot 应用程序中创建的四个 REST API 中的每一个创建和测试请求。
在 Postman 中创建和测试请求
在左侧面板中,单击 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”(发送)。
Java Spring Boot API 项目的下一步是什么?
通过本教程,您已经学习了如何利用 Spring Boot 来构建 REST API,并且掌握了在 Postman 中对这些 API 进行测试的方法。
接下来,通过查看这些文章并在 Spring Boot 应用程序中实现 Twilio API 来挑战自己:
- 在 Spring Boot 应用程序中发送短信
- 利用 Spring Boot 在 Java 中构建 SMS 仪表板
- 结合 Twilio Media Streams、Java、WebSockets 与 Spring Boot 实现电话转录
- 在 Java 中使用 Spring Boot 编写 Twilio Webhook
- 如何使用 Twilio TaskRouter、Java 和 Spring Boot 为房地产经纪人构建 REST API
原文链接:https://www.twilio.com/en-us/blog/create-rest-apis-java-spring-boot