您将在 上构建一个接受 HTTP GET 请求的服务。http://localhost:8080/greeting
它将使用问候语的 JSON 表示形式进行响应,如以下列表所示:
(资料图)
{"id":1,"content":"Hello, World!"}
可以使用查询字符串中的可选参数自定义问候语,如以下清单所示:name
http://localhost:8080/greeting?name=User
参数值将覆盖 的默认值,并反映在响应中,如以下清单所示:name
World
{"id":1,"content":"Hello, User!"}
像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。
要从头开始,请继续从 Spring 初始化开始.
要跳过基础知识,请执行以下操作:
下载并解压缩本指南的源存储库,或使用吉特:git clonehttps://github.com/spring-guides/gs-rest-service.git
光盘成gs-rest-service/initial
跳转到创建资源表示类.完成后,您可以根据 中的代码检查结果。gs-rest-service/complete
你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。
手动初始化项目:
导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。单击“依赖关系”,然后选择“Spring Web”。单击生成。下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。 |
您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。 |
设置项目和生成系统后,可以创建 Web 服务了。
从考虑服务交互开始该过程。
该服务将处理 的请求,(可选)在查询字符串中使用参数。请求应返回一个响应,其中包含表示问候语的正文中的 JSON。它应类似于以下输出:GET
/greeting
name
GET
200 OK
{ "id": 1, "content": "Hello, World!"}
该字段是问候语的唯一标识符,是问候语的文本表示形式。id
content
若要对问候语表示形式进行建模,请创建资源表示形式类。为此,请提供一个普通的旧 Java 对象,其中包含 和 数据的字段、构造函数和访问器,如以下清单(来自 )所示:id
content
src/main/java/com/example/restservice/Greeting.java
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; }}
此应用程序使用杰克逊·库,用于自动将类型的实例封送到 JSON 中。默认情况下,网络启动器包含杰克逊。 |
在Spring构建RESTful Web服务的方法中,HTTP请求由控制器处理。这些组件由@RestController注释,以及以下清单 (from ) 中显示的 通过返回类的新实例来处理请求:GreetingController
src/main/java/com/example/restservice/GreetingController.java
GET
/greeting
Greeting
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;@RestControllerpublic 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)); }}
这个控制器简洁明了,但引擎盖下有很多事情要做。我们一步一步地分解它。
注释确保 HTTP GET 请求映射到方法。@GetMapping
/greeting
greeting()
其他 HTTP 动词也有配套注释(例如 对于开机自检)。还有一个注释,它们都派生自,并且可以作为同义词(例如)。 |
@RequestParam
将查询字符串参数的值绑定到方法的参数中。如果请求中没有该参数,则使用 of。name
name
greeting()
name
defaultValue
World
方法主体的实现创建并返回一个新对象,该对象基于 和 的下一个值 和 属性 通过使用问候语格式化给定的格式。Greeting
id
content
counter
name
template
传统 MVC 控制器和前面显示的 RESTful Web 服务控制器之间的主要区别在于创建 HTTP 响应正文的方式。这个 RESTful Web 服务控制器不是依靠视图技术来执行问候数据到 HTML 的服务器端呈现,而是填充并返回一个对象。对象数据将作为 JSON 直接写入 HTTP 响应。Greeting
此代码使用 Spring@RestController注释,它将类标记为控制器,其中每个方法都返回域对象而不是视图。它是包含 和 的简写。@Controller
@ResponseBody
该对象必须转换为 JSON。由于 Spring 的 HTTP 消息转换器支持,您无需手动进行此转换。因为Greeting
杰克逊 2在类路径上,春天的MappingJackson2HttpMessageConverter自动选择将实例转换为 JSON。Greeting
@SpringBootApplication
是一个方便的注释,它添加了以下所有内容:
@Configuration
:将类标记为应用程序上下文的 Bean 定义源。@EnableAutoConfiguration
:告诉 Spring 引导根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果 在类路径上,则此注释会将应用程序标记为 Web 应用程序并激活关键行为,例如设置 .spring-webmvc
DispatcherServlet
@ComponentScan
:告诉 Spring 在包中查找其他组件、配置和服务,让它找到控制器。com/example
该方法使用 Spring Boot 的方法启动应用程序。您是否注意到没有一行 XML?也没有文件。此 Web 应用程序是 100% 纯 Java,您无需处理配置任何管道或基础结构。main()
SpringApplication.run()
web.xml
您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。
如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./gradlew bootRun
./gradlew build
java -jar build/libs/gs-rest-service-0.1.0.jar
如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./mvnw spring-boot:run
./mvnw clean package
java -jar target/gs-rest-service-0.1.0.jar
此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件. |
将显示日志记录输出。该服务应在几秒钟内启动并运行。
现在服务已启动,请访问 ,您应该在其中看到:http://localhost:8080/greeting
{"id":1,"content":"Hello, World!"}
通过访问提供查询字符串参数。请注意属性的值如何从 更改为 ,如下面的清单所示:name
http://localhost:8080/greeting?name=User
content
Hello, World!
Hello, User!
{"id":2,"content":"Hello, User!"}
此更改表明 中的安排按预期工作。参数的默认值为 ,但可以通过查询字符串显式重写。@RequestParam
GreetingController
name
World
另请注意属性是如何从 更改为 的。这证明您正在跨多个请求处理同一实例,并且其字段在每次调用时按预期递增。id
1
2
GreetingController
counter
祝贺!您刚刚使用 Spring 开发了一个 RESTful Web 服务。
以下指南也可能有所帮助:
使用 REST 访问 GemFire 数据使用 REST 访问 MongoDB 数据使用 MySQL 访问数据使用 REST 访问 JPA 数据使用 REST 访问 Neo4j 数据使用 RESTful Web 服务使用 AngularJS 使用 RESTful Web 服务使用 jQuery 使用 RESTful Web 服务将 RESTful Web 服务与 rest 一起使用.js保护 Web 应用程序使用 Spring 构建 REST 服务React.js 和 Spring Data REST使用 Spring 引导构建应用程序使用 Restdocs 创建 API 文档为 REST 富 Web 服务启用跨源请求构建超媒体驱动的 RESTful Web 服务断路器想要编写新指南或为现有指南做出贡献?查看我们的贡献准则.