Spring官方网站原文地址:https://spring.io/guides/gs/rest-service/
本文是在官方原文的基础上翻译并实操。
本文使用的环境,STS,JDK1.8
Building a RESTful Web Service
本指南将指导您使用Spring创建一个“Hello, World” RESTful web服务的过程。
What You Will Build
您将构建一个在 http://localhost:8080/greeting 接受HTTP GET请求的服务。它将响应一个JSON表示的问候语,如下所示:
{"id":1,"content":"Hello, World!"}
您可以在查询字符串中使用可选的name参数定制问候语,如下所示:
http://localhost:8080/greeting?name=User
name参数值覆盖了World的默认值,并反映在响应中,如下所示:
{"id":1,"content":"Hello, User!"}
What You Need
-
About 15 minutes
-
A favorite text editor or IDE
-
JDK 1.8 or later
You can also import the code straight into your IDE:
How to complete this guide
1. 可以去GitHub下载源代码 https://github.com/spring-guides/gs-rest-service
2. 可以自己手动创建从头开始,下面是创建的详细过程。
New Spring Starter Project
新建一个Spring Starter Project,勾选添加Spring Web依赖,然后Finish
Starting with Spring Initialize
对于所有的Spring应用程序,都应该从Spring初始化开始。Initializr提供了一种快速的方法来拉入应用程序所需的所有依赖项,并为您做了许多设置。这个示例只需要Spring Web依赖项。
这里初始化的意思是说,开发一个Spring程序时,我们应先配置maven或Gradle来添加依赖。本文使用的是Maven。
新建项目时自动产生的pom.xml中的依赖已经足够了,需要注意的一点是,新建项目后pom.xml中的Java version是11版本,本机装的是1.8版本,打包成jar的时候运行因版本不一致而出错,所以如果要打包成jar运行,需要修改pom.xml中的Java版本,与运行环境一致。
Create a Resource Representation Class
要对greeting表示进行建模,请创建一个资源表示类。为此,提供一个POJO,其中包含id和内容数据的字段、构造函数和访问器,如下所示:
package com.example.restservice; public class Greeting { private final long id; private final String content; public Greeting(long id, String content) { this.id = id; this.content = content; } public long getId() { return id; } public String getContent() { return content; } }
Create a Resource Controller
在Spring构建RESTful web服务的方法中,HTTP请求由controller处理。这些组件由@RestController
标注标识,下面显示的GreetingControlle
通过返回Greeting
类的新实例来处理/greeting
的GET
请求
package com.example.restservice; import java.util.concurrent.atomic.AtomicLong; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @GetMapping("/greeting") public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) { return new Greeting(counter.incrementAndGet(), String.format(template, name)); } }
下面是对程序中注释的详解。
@GetMapping
注释确保对/greeting
的HTTP GET请求映射到greeting()
方法。
其他HTTP动作也有相应的注释(例如,POST的@PostMapping)。还有一个@RequestMapping注释,它们都是从它派生出来的,可以作为同义词(例如@RequestMapping(method=GET))。
@RequestParam将查询字符串参数名称的值绑定到greeting()方法的name参数中。如果请求中没有name参数,则使用World的defaultValue。
方法体的实现根据counter
的下一个值创建并返回一个新的Greeting对象,该对象具有id和内容属性,并使用Greeting template给定的名称。
传统MVC控制器与前面所示的RESTful web服务控制器之间的主要区别是创建HTTP响应体的方式。这个RESTful web服务控制器填充并返回一个greeting对象,而不是依赖视图技术来执行将greeting数据呈现到HTML的服务器端呈现。对象数据将作为JSON直接写入HTTP响应。
Greeting对象必须转换为JSON。由于Spring的HTTP消息转换器支持,您不需要手动进行这种转换。因为Jackson 2在类路径中,Spring的MappingJackson2HttpMessageConverter会被自动选择来将Greeting实例转换为JSON。
Test the Service
修改默认端口开始测试
访问http://localhost:8085/greeting
添加name