Spring Boot 构建一个RESTful Web服务

Reco

本指南将指导您使用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

<settings>
    <mirrors>
        <mirror>
            <id>aliyun</id>
            <name>aliyun</name>
            <mirrorOf>central</mirrorOf>
            <!-- 国内推荐阿里云的Maven镜像 -->
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </mirror>
    </mirrors>
</settings>

快速察看效果

要跳过基本步骤,请执行以下操作。

下载并解压本指南的源码库,或者使用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\<JARFILE>

对于所有的Spring应用,你应该从Spring Initializr开始。Initializr提供了一种快速的方法来引入应用程序所需的所有依赖关系,并为您做了大量的设置。这个例子只需要Spring Web依赖关系。

您可以直接从Spring Initializr中获取包含必要依赖项的Maven构建文件。以下列表显示了选择Maven时创建的pom.xml文件。

解析

对于所有的Spring应用,你应该从Spring Initializr开始。Initializr提供了一种快速的方法来引入应用程序所需的所有依赖关系,并为您做了大量的设置。这个例子只需要Spring Web依赖关系。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>rest-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rest-service</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

创建资源表示类

现在你已经建立了项目和构建系统,你可以创建你的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服务。

阅读 275

敢作敢为

4.6k 声望
403 粉丝
0 条评论

敢作敢为

4.6k 声望
403 粉丝
宣传栏