Spring Boot REST示例

时间:2020-02-23 14:35:49  来源:igfitidea点击:

Spring Boot是Spring Framework的一个很棒的模块。
一旦习惯了,那么使用Spring就是一件轻而易举的事,因为它可以处理所有特定于Spring容器的配置,并使我们可以将更多精力放在应用程序上。

REST Web服务近来非常流行,因此在本教程中,我们将看到使用Spring Boot创建RESTful Web服务的难易程度。

Spring Boot REST依赖关系

由于Web服务在服务器上运行,因此除了Spring Boot之外,我们需要将Spring MVC添加到我们的项目中。
我正在使用Eclipse创建基本的Spring Boot项目,但是您也可以使用Spring Initializr。

当我们使用Eclipse创建Spring项目时,它实际上使用Spring Initializr并对其进行配置。
让我们开始吧。

Spring Boot REST项目

  • 如下图所示,创建新的Spring Starter Project。
    Eclipse应该对此具有Spring支持,所有最新的Eclipse版本都具有内置的Spring支持。

  • 在下一个弹出屏幕中,提供项目基本详细信息。
    我正在使用Maven,您也可以使用Gradle。

  • 下一个屏幕要求添加除Spring Boot以外的依赖项。
    添加" Web"依赖项,然后单击"下一步"。

  • 我们可以在前面的屏幕中单击"完成",但是单击"下一步"将为我们提供Spring Initializr URL,我们可以使用它通过命令行轻松地创建此项目。

这是完整的URL,您可以在浏览器中转到该URL,然后下载到目前为止我们创建的骨架Maven项目。

  • 下图显示了自动生成的项目的内容,其中最重要的是SpringBootRestApplication类,该类配置为Spring Boot应用程序并包含java main方法。
    当我们运行这个类时,它会自动以Spring Boot Web项目的形式运行我们的项目,如果您要查看控制台日志,它应该显示Tomcat在端口8080(http)上启动,上下文路径为

现在我们的基础Spring Boot REST应用程序已经准备就绪,是时候添加一些端点和业务逻辑了。

我们将使用一个Java bean类来发送REST Web服务响应。
这是它的代码。

https://start.spring.io/starter.zip?name=Spring-Boot-REST&groupId=com.theitroad.spring&artifactId=Spring-Boot-REST&version=0.0.1-SNAPSHOT&description=Spring+Boot+REST+Example&packageName=com.theitroad.spring&type=maven-project&packaging=jar&javaVersion=10&language=java&bootVersion=2.0.2.RELEASE&dependencies=web

Spring REST端点配置

我们将创建一个@RestController并添加一些方法,并使用@RequestMapping对其进行注释。
下面是我们的REST Controller类,它公开了一些GET和POST端点。

package com.theitroad.spring;

import org.springframework.stereotype.Component;

@Component
public class Person {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

请正确地完成上述程序,这是本教程最重要的部分。
很容易理解这里发生的事情:

  • 当我们用@ RestController注释控制器类时,Spring Boot会扫描它来查找要配置的REST端点。

  • 方法上的@RequestMapping注释告诉Spring使用此方法作为任何客户端请求的处理程序。
    这是非常重要的spring注释,我们可以配置其他功能,例如支持的HTTP方法,请求的Content-Type,响应内容类型等。
    默认情况下,支持GET方法并返回JSON响应。

就是这样,我们的Spring Boot RESTful网络服务已经可以运行和测试了。

Spring Boot REST Web服务测试

当您运行主类时,请检查日志以了解端点配置。

package com.theitroad.spring;

import org.springframework.beans.factory.annotation.Autowired;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonController {

	@Autowired
	private Person person;
	
	@RequestMapping("/")
	public String healthCheck() {
		return "OK";
	}
	
	@RequestMapping("/person/get")
	public Person getPerson(@RequestParam(name="name", required=false, defaultValue="Unknown") String name) {
		person.setName(name);
		return person;
	}
	
	@RequestMapping(value="/person/update", method=RequestMethod.POST)
	public Person updatePerson(@RequestParam(name="name", required=true) String name) {
		person.setName(name);
		return person;
	}
	
}

一切似乎都不错,可以在浏览器本身中测试GET请求。

我正在使用Postman Chrome应用测试POST请求。

Spring Boot REST JSON请求响应

JSON是REST网络服务的标准消息格式,我不喜欢我们接受String作为POST请求,让我们更改接受JSON请求的方法。

2016-05-25 16:20:15.961  INFO 11802 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String com.theitroad.spring.PersonController.healthCheck()
2016-05-25 16:20:15.962  INFO 11802 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person/get]}" onto public com.theitroad.spring.Person com.theitroad.spring.PersonController.getPerson(java.lang.String)
2016-05-25 16:20:15.962  INFO 11802 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person/update],methods=[POST]}" onto public com.theitroad.spring.Person com.theitroad.spring.PersonController.updatePerson(java.lang.String)

就这样,方法注释中的几个更改就完成了。
现在,当您运行主程序时,它将为端点配置生成以下输出。

@RequestMapping(value="/person/update", method=RequestMethod.POST, consumes = "application/json")
	public Person updatePerson(@RequestBody Person p) {
	person.setName(p.getName());
	return person;
}