本指南将指导您使用Spring创建 "Hello, World "RESTful Web服务的过程。
您将构建的内容
你将建立一个服务,它将接受HTTP GET请求,地址是
http://localhost:8080/greeting。
它将响应一个JSON表示的问候语,如下面的列表所示。
{"id":1, "content": "Hello, World!"}
您可以在查询字符串中使用可选的名称参数自定义问候语,如下列表所示。
http://localhost:8080/greeting?name=User
name参数值会覆盖World的默认值,并反映在响应中,如下列表所示。
{"id":1, "content": "Hello,User!"}
您需要什么
JDK 1.8或更高版本
Maven 3.2+
配置java
下载安装Java
配置JAVA_HOME = JDK目录
修改mirror
C:/Users/Administrator/.m2/settings.xml
aliyun
aliyun
central
http://maven.aliyun.com/nexus/content/groups/public/
快速察看效果
要跳过基本步骤,请执行以下操作。
下载并解压本指南的源码库,或者使用Git克隆:
git clone https://github.com/spring-guides/gs-rest-service.git。
cd gs-rest-service/complete
mvnw package
java -jar target
然后打开浏览器,贴入如下地址:
http://localhost:8080/greeting。
它将响应一个JSON表示的问候语,如下面的列表所示。
{"id":1, "content": "Hello, World!"}
创建脚手架并且打包
使用https://start.spring.io/ 生成一个zip文件,解压后得到一个目录,其内是脚手架代码
进入目录,执行:
mvnw package
漫长的执行后,看到BUILD SUCCESS
执行
java –jar target\
对于所有的Spring应用,你应该从Spring Initializr开始。Initializr提供了一种快速的方法来引入应用程序所需的所有依赖关系,并为您做了大量的设置。这个例子只需要Spring Web依赖关系。
您可以直接从Spring Initializr中获取包含必要依赖项的Maven构建文件。以下列表显示了选择Maven时创建的pom.xml文件。
解析
对于所有的Spring应用,你应该从Spring Initializr开始。Initializr提供了一种快速的方法来引入应用程序所需的所有依赖关系,并为您做了大量的设置。这个例子只需要Spring Web依赖关系。
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.4.2
com.example
rest-service
0.0.1-SNAPSHOT
rest-service
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
创建资源表示类
现在你已经建立了项目和构建系统,你可以创建你的Web服务。通过思考服务交互开始这个过程。
该服务将处理对/greeting的GET请求,在查询字符串中可选择使用名称参数。GET请求应该返回一个200 OK的响应,在body中包含代表问候语的JSON。它应该类似于下面的输出。
{
"id": 1,
"content"。"Hello,world!"
}
id字段是问候语的唯一标识符,内容是问候语的文本表示。
为了对问候语的表示进行建模,创建一个资源表示类。为此,提供一个Java对象,其中包含字段、构造函数以及id和内容数据的访问器,如下列表所示(来自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.)
public Greeting(long id, String content) {
this.id = id.com
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
该应用程序使用Jackson JSON库自动将Greeting类型的实例汇集成JSON。web启动程序默认包含Jackson。
创建一个资源控制器
在Spring构建RESTful Web服务的方法中,HTTP请求由一个控制器处理。这些组件由@RestController注解标识,下面列表中显示的GreetingController(来自src/main/java/com/example/restservice/GreetingController.java)通过返回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动词的配套注解(例如:@PostMapping用于POST)。还有一个@RequestMapping注解,它们都是由这个注解派生出来的,可以作为一个同义词(例如@RequestMapping(method=GET))。
- 查询参数和函数参数的绑定。@RequestParam将查询字符串参数名称的值绑定到greeting()方法的name参数中。如果请求中没有name参数,则使用World的defaultValue。
- 返回结果。方法体的实现根据计数器的下一个值创建并返回一个新的Greeting对象,该对象具有id和内容属性,并通过使用greeting模板对给定的名称进行格式化。传统的MVC控制器和前面展示的RESTful Web服务控制器之间的一个关键区别是创建HTTP响应体的方式。这个RESTful Web服务控制器不是依靠视图技术来执行服务器端将问候数据渲染成HTML,而是填充并返回一个Greeting对象。该对象数据将以JSON形式直接写入HTTP响应。Greeting对象必须被转换为JSON。由于Spring的HTTP消息转换器支持,您无需手动进行这种转换。因为Jackson 2在classpath上,所以Spring的MappingJackson2HttpMessageConverter会自动选择将Greeting实例转换为JSON。
- 控制器表示。这段代码使用了Spring @RestController注解,它标志着该类是一个控制器,其中每个方法都会返回一个域对象而不是视图。它是包括@Controller和@ResponseBody的简写。
App代码
也看看应用代码:
package com.example.restservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RestServiceApplication {
public static void main(String[] args) {
SpringApplication.run(RestServiceApplication.class, args);
}
}
@SpringBootApplication是一个方便的注解,它添加了以下所有内容。
- @Configuration: 标记该类作为应用上下文的Bean定义源。
- @EnableAutoConfiguration:告诉Spring Boot开始添加bean定义。告诉Spring Boot开始根据classpath设置、其他Bean和各种属性设置来添加Bean。例如,如果classpath上有spring-webmvc,这个注解就会将应用程序标记为web应用程序,并激活关键行为,例如设置DispatcherServlet。
- @ComponentScan.告诉Spring寻找其他组件,并激活关键行为,例如设置DispatcherServlet。告诉Spring在com/example包中寻找其他组件、配置和服务,让它找到控制器。
main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。你注意到没有一行XML吗?也没有web.xml文件。这个web应用程序是100%纯Java的,你不需要处理任何管道或基础设施的配置。
建立一个可执行的JAR
你可以用Gradle或Maven从命令行运行应用程序。你也可以构建一个可执行的JAR文件,其中包含所有必要的依赖关系、类和资源,然后运行它。构建一个可执行的jar,可以很容易地在整个开发生命周期中,在不同的环境中,将服务作为一个应用来发布、版本和部署,等等。
如果你使用Gradle,你可以通过使用./gradlew bootRun来运行应用程序。或者,你可以通过使用./gradlew build来构建JAR文件,然后运行JAR文件,如下所示。
java -jar build/libs/gs-rest-service-0.1.0.jar
如果你使用Maven,你可以使用./mvnw spring-boot:run来运行应用程序。另外,你也可以用./mvnw clean package构建JAR文件,然后运行JAR文件,如下所示。
java -jar target/gs-rest-service-0.1.0.jar
这里描述的步骤可以创建一个可运行的JAR。你也可以建立一个经典的WAR文件。
日志输出会显示。服务应该在几秒钟内启动并运行。
测试服务
现在服务已经开通,请访问http://localhost:8080/greeting,在那里你应该可以看到。
{"id":1, "content": "你好,世界!"}
通过访问http://localhost:8080/greeting?name=User,提供名称查询字符串参数。请注意content属性的值是如何从Hello,World!变为Hello,User!的,如下列表所示。
{"id":2, "content": "Hello, User!"}
这个变化表明GreetingController中的@RequestParam安排按照预期工作。名称参数的默认值是World,但可以通过查询字符串明确地重写。
还请注意id属性如何从1变成了2,这证明你在多个请求中针对同一个GreetingController实例工作,并且每次调用时,它的计数器字段都按预期递增。
总结
恭喜你!你刚刚用Spring开发了一个RESTful Web服务。你刚刚用Spring开发了一个RESTful web服务。