使用 Gradle 构建 Spring Boot REST 应用程序

在本教程中,我们将使用Spring Boot和Gradle创建一个简单的RESTful Web服务。Spring Boot使得创建独立、生产级的基于Spring的应用程序变得简单,而Gradle是一个强大的构建工具,简化了构建过程。

**什么是REST?**

REST,即Representational State Transfer,是一套确保API互操作性、可扩展性和可维护性的架构原则。想象一下搭建乐高积木——只要遵循RESTful指南,不同的应用程序就能无缝地与你的API交互,就像乐高积木无论出自哪个套装都能拼接在一起一样。

**什么是Spring Boot?**

Spring Boot是一个简化了开发过程的强大框架。将其视为一个预装了组件和功能的工具包,节省了你在设置应用基础设施上的时间和精力。你可以专注于构建API的核心逻辑,而不必陷入样板代码的泥潭。

准备好释放你内心的API开发者了吗?本指南将指导你使用流行的构建工具Gradle创建你的第一个Spring Boot REST应用。无论你是经验丰富的Java程序员还是初探此领域的新手,这个逐步指南都将为你提供构建动态和交互式Web服务所需的关键知识。

**关键要点**

  • 使用Spring Boot创建RESTful API: Spring Boot是一个流行的Java框架,它简化了RESTful API的开发过程。它提供了丰富的开箱即用特性,如自动配置和依赖注入,这些可以节省您的时间和精力。
  • 理解RESTful API的核心概念: REST代表表述性状态转移。它是一组确保API互操作性、可扩展性和可维护性的架构原则。RESTful API的一些关键概念包括资源表示、HTTP方法和状态码。
  • 实现基本的CRUD操作: CRUD代表创建、读取、更新和删除。这些是您需要在API端点中实现的基本操作,以便用户能够与您的数据交互。
  • 彻底测试您的API: 在部署到生产环境之前,彻底测试API至关重要。这将帮助您确保其按预期工作且没有错误。
  • 探索高级功能: 随着您对Spring Boot和RESTful API的熟悉度增加,您可以探索更多高级功能,如数据管理、安全性和认证。

通过将REST的力量与Spring Boot的简化方法相结合,您将能够创建高效且用户友好的API,这些API可以无缝集成到其他应用程序中。那么,您准备好使用Spring Boot和Gradle解锁RESTful API的潜力了吗?让我们开始吧!

前提条件

  • 已安装Java开发工具包(JDK)11
  • 已安装最新版Gradle
  • 基本掌握Java与Spring核心概念

步骤1:项目搭建

启动项目需执行以下三个步骤。

  • 打开终端或命令提示符
  • 为项目创建新目录
  • 进入项目目录
  • 初始化Spring Boot项目基础结构

Shell

 

mkdir spring-boot-rest-gradle
cd spring-boot-rest-gradle
gradle init --type spring-boot

步骤2:创建Spring Boot项目

请编辑目录中的现有build.gradle文件,填入以下内容。

Groovy

 

plugins {
    id 'org.springframework.boot' version '2.6.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

此配置建立了一个带有必要依赖的基本Spring Boot项目。

步骤3:创建REST控制器

src/main/java/com/example路径下新建名为HelloController.java的文件,内容如下:

Java

 

import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/api")
public class HelloController {

    private final List<String> messages = new ArrayList<>();

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot!";
    }

    @GetMapping("/messages")
    public List<String> getMessages() {
        return messages;
    }

    @PostMapping("/messages")
    public String addMessage(@RequestBody String message) {
        messages.add(message);
        return "Message added: " + message;
    }

    @PutMapping("/messages/{index}")
    public String updateMessage(@PathVariable int index, @RequestBody String updatedMessage) {
        if (index < messages.size()) {
            messages.set(index, updatedMessage);
            return "Message updated at index " + index + ": " + updatedMessage;
        } else {
            return "Invalid index";
        }
    }

    @DeleteMapping("/messages/{index}")
    public String deleteMessage(@PathVariable int index) {
        if (index < messages.size()) {
            String removedMessage = messages.remove(index);
            return "Message removed at index " + index + ": " + removedMessage;
        } else {
            return "Invalid index";
        }
    }
}

该控制器定义了针对消息列表的GET、POST、PUT和DELETE操作的REST端点。

步骤4:运行应用

打开终端或命令提示符,执行以下命令:

Java

 

./gradlew bootRun

访问http://localhost:8080/api/hello检查初始端点。可使用curl、Postman或其他REST客户端测试其他端点。

步骤5:编写测试用例

src/test/java/com/example目录下创建一个名为HelloControllerTest.java的新文件,内容如下:

Java

 

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;

@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @BeforeEach
    public void setUp() {
        // 每次测试前清除消息
        // 这确保每次测试都有一个干净的状态
        // 或者,你可以使用测试数据库或模拟数据
        // 根据你的需求
        HelloController messagesController = new HelloController();
        messagesController.getMessages().clear();
    }

    @Test
    public void testSayHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/api/hello"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Hello, Spring Boot!"));
    }

    @Test
    public void testGetMessages() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/api/messages"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$", hasSize(0)));
    }

    @Test
    public void testAddMessage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/messages")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Test Message\""))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Message added: Test Message"));
    }

    @Test
    public void testUpdateMessage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/messages")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Initial Message\""));

        mockMvc.perform(MockMvcRequestBuilders.put("/api/messages/0")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Updated Message\""))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Message updated at index 0: Updated Message"));
    }

    @Test
    public void testDeleteMessage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/messages")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Message to Delete\""));

        mockMvc.perform(MockMvcRequestBuilders.delete("/api/messages/0"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Message removed at index 0: Message to Delete"));
    }
}

这些测试用例使用Spring Boot的测试特性来模拟HTTP请求并验证REST控制器的行为。

第6步:运行测试

打开终端或命令提示符,运行以下命令执行测试:

Java

 

./gradlew test 

审查测试结果,确保所有测试都成功通过。

结论

恭喜!你已成功使用Spring Boot和Gradle创建了一个带有CRUD操作的基本RESTful Web服务。本教程涵盖了GET、POST、PUT和DELETE操作端点的实现以及相应的测试用例。

附加说明:

  • 这是一个非常基础的示例。你可以通过创建更多端点、处理不同的HTTP方法(POST、PUT、DELETE)以及添加数据管理等功能来扩展它。
  • 考虑使用JUnit等框架为你的控制器添加单元测试。
  • 您可以使用Spring Initializr(https://start.spring.io/)快速生成包含额外依赖和配置的项目。

如需深入学习,请查阅以下资源:

记住,这只是您Spring Boot旅程的起点!继续探索并构建令人惊叹的应用程序。

Source:
https://dzone.com/articles/build-your-first-spring-boot-rest-application-with