原文: https://howtodoinjava.com/spring-boot2/rest/rest-api-example/

在本 Spring Rest 教程中,学习使用 Spring Boot 2 框架创建 REST API,该 API 将 JSON 响应返回给客户端。 在本 Spring Boot 2 REST API 教程中,我们将逐步创建两个简单的 GET 和 POST API 并进行测试。

1. Maven 依赖

首先,创建一个简单的 Maven Web 项目,并根据pom.xml文件中的 spring boot 依赖项进行更新。

重要的依赖项是spring-boot-starter-parent阅读更多)和spring-boot-starter-web阅读更多)。 入门级 Web 依赖关系可传递地包含更多依赖关系,以构建 Web 应用程序,例如spring-webmvcspring-webhibernate-validatortomcat-embed-coretomcat-embed-eltomcat-embed-websocketjackson-databindjackson-datatype-jdk8jackson-datatype-jsr310jackson-module-parameter-names

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.howtodoinjava.demo</groupId>
  7. <artifactId>springbootdemo</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <name>SpringBootDemo</name>
  11. <description>Spring Boot2 REST API Demo for https://howtodoinjava.com</description>
  12. <parent>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-parent</artifactId>
  15. <version>2.0.5.RELEASE</version>
  16. <relativePath />
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  21. <java.version>1.8</java.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <plugins>
  36. <plugin>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>

2. Spring Boot 2 REST API 控制器

  • 在 Spring 中,能够处理 REST API 请求的控制器类称为 rest 控制器。 应使用@RestController注解进行注解。
  • 资源 uri 在@RequestMapping注解中指定。 它可以同时应用于类级别和方法级别。 添加类级别路径和方法级别路径后,将解析 API 的完整 URI。
  • 我们应该始终写produceconsume属性来指定 API 的媒体类型属性。 切勿对假设作出响应。

在给定的控制器中,我们有两种 API 方法。 随时根据需要添加更多方法。

  1. HTTP GET /employee - 返回员工列表。
  2. HTTP POST /employee – 在员工集合中添加一个员工。

EmployeeController.java

  1. package com.howtodoinjava.rest.controller;
  2. import java.net.URI;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.ResponseEntity;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. import org.springframework.web.bind.annotation.RequestBody;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
  11. import com.howtodoinjava.rest.dao.EmployeeDAO;
  12. import com.howtodoinjava.rest.model.Employee;
  13. import com.howtodoinjava.rest.model.Employees;
  14. @RestController
  15. @RequestMapping(path = "/employees")
  16. public class EmployeeController
  17. {
  18. @Autowired
  19. private EmployeeDAO employeeDao;
  20. @GetMapping(path="/", produces = "application/json")
  21. public Employees getEmployees()
  22. {
  23. return employeeDao.getAllEmployees();
  24. }
  25. @PostMapping(path= "/", consumes = "application/json", produces = "application/json")
  26. public ResponseEntity<Object> addEmployee(@RequestBody Employee employee)
  27. {
  28. Integer id = employeeDao.getAllEmployees().getEmployeeList().size() + 1;
  29. employee.setId(id);
  30. employeeDao.addEmployee(employee);
  31. URI location = ServletUriComponentsBuilder.fromCurrentRequest()
  32. .path("/{id}")
  33. .buildAndExpand(employee.getId())
  34. .toUri();
  35. return ResponseEntity.created(location).build();
  36. }
  37. }

我们可以使用application.properties文件来控制和自定义许多实现细节。 但是为了使此演示简单,我将其保留为空白。

3. @SpringBootApplication

我们的 REST API 框架已准备就绪。 现在,我们需要配置 Spring 以检测我们的 rest 控制器(使用自动扫描)并在嵌入式 tomcat 服务器中部署 api。 幸运的是,Spring Boot 通过使用自动配置的概念使所有这些事情变得非常容易。

自动配置尝试猜测和配置您可能需要的 bean。 自动配置类通常基于应用程序类路径中的 jar 和我们在@Configuration类中另外定义的 bean 来应用。

在这种情况下,它会执行以下操作。

  1. 它检测到spring-webmvc,因此配置默认的 spring mvc 应用程序 bean。 它有助于扫描和配置@RestController和类似的注解。
  2. 它检测到嵌入的 tomcat jar,因此为我们配置嵌入式 tomcat。
  3. 它检测到 JSON jar,因此可以配置对 API 的 JSON 支持。

SpringBootDemoApplication.java

  1. package com.howtodoinjava.rest;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class SpringBootDemoApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(SpringBootDemoApplication.class, args);
  8. }
  9. }

4. 模型类和 DAO

这些类与 REST 没有直接关系。 仍然让我们看看它们是如何编写的。

Employee.java

  1. package com.howtodoinjava.rest.model;
  2. public class Employee {
  3. public Employee() {
  4. }
  5. public Employee(Integer id, String firstName, String lastName, String email) {
  6. super();
  7. this.id = id;
  8. this.firstName = firstName;
  9. this.lastName = lastName;
  10. this.email = email;
  11. }
  12. private Integer id;
  13. private String firstName;
  14. private String lastName;
  15. private String email;
  16. //Getters and setters
  17. @Override
  18. public String toString() {
  19. return "Employee [id=" + id + ", firstName=" + firstName + ",
  20. lastName=" + lastName + ", email=" + email + "]";
  21. }
  22. }

Employees.java

  1. package com.howtodoinjava.rest.model;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class Employees
  5. {
  6. private List<Employee> employeeList;
  7. public List<Employee> getEmployeeList() {
  8. if(employeeList == null) {
  9. employeeList = new ArrayList<>();
  10. }
  11. return employeeList;
  12. }
  13. public void setEmployeeList(List<Employee> employeeList) {
  14. this.employeeList = employeeList;
  15. }
  16. }

DAO 类使用静态列表存储数据。 在这里,我们需要实现实际的数据库交互。

EmployeeDAO.java

  1. package com.howtodoinjava.rest.dao;
  2. import org.springframework.stereotype.Repository;
  3. import com.howtodoinjava.rest.model.Employee;
  4. import com.howtodoinjava.rest.model.Employees;
  5. @Repository
  6. public class EmployeeDAO
  7. {
  8. private static Employees list = new Employees();
  9. static
  10. {
  11. list.getEmployeeList().add(new Employee(1, "Lokesh", "Gupta", "howtodoinjava@gmail.com"));
  12. list.getEmployeeList().add(new Employee(2, "Alex", "Kolenchiskey", "abc@gmail.com"));
  13. list.getEmployeeList().add(new Employee(3, "David", "Kameron", "titanic@gmail.com"));
  14. }
  15. public Employees getAllEmployees()
  16. {
  17. return list;
  18. }
  19. public void addEmployee(Employee employee) {
  20. list.getEmployeeList().add(employee);
  21. }
  22. }

5. Spring Boot REST 演示

要启动该应用程序,请运行SpringBootDemoApplication类中的main()方法。 它将启动嵌入式 tomcat 服务器。 在服务器日志中,您将看到已在 Spring 上下文中注册了 API。

Console

  1. s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/employees/],methods=[GET],produces=[application/json]}" onto public com.howtodoinjava.rest.model.Employees com.howtodoinjava.rest.controller. EmployeeController.getEmployees()
  2. s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/employees/],methods=[POST], consumes=[application/json], produces=[application/json]}" onto public org.springframework.http.ResponseEntity <java.lang.Object> com.howtodoinjava.rest.controller. EmployeeController.addEmployee( com.howtodoinjava.rest.model.Employee )

5.1. HTTP GET /employee

服务器启动后,使用其他客户端访问 API。

Spring Boot 2 REST API 示例 - 图1

Spring Boot REST HTTP GET

API response

  1. {
  2. "employeeList": [
  3. {
  4. "id": 1,
  5. "firstName": "Lokesh",
  6. "lastName": "Gupta",
  7. "email": "howtodoinjava@gmail.com"
  8. },
  9. {
  10. "id": 2,
  11. "firstName": "Alex",
  12. "lastName": "Kolenchiskey",
  13. "email": "abc@gmail.com"
  14. },
  15. {
  16. "id": 3,
  17. "firstName": "David",
  18. "lastName": "Kameron",
  19. "email": "titanic@gmail.com"
  20. }
  21. ],
  22. }

5.2. HTTP POST /employee

Spring Boot 2 REST API 示例 - 图2

Spring Boot REST HTTP POST

Response headers

  1. location: http://localhost:8080/employees/4
  2. content-length: 0
  3. date: Sat, 06 Oct 2018 04:33:37 GMT

再次点击 GET 请求,这一次我们也将获得新增的员工。

Spring Boot 2 REST API 示例 - 图3

Spring Boot REST HTTP GET – Updated

6. 更多例子

  1. Spring@Controller@RestController注解

让我知道您是否在此 spring boot restful web 服务 json 示例中进行查询。

学习愉快!

下载源码

参考文献:

SpringBoot 启动器