构建一个REST风格的Web服务

原文:https://spring.io/guides/gs/rest-service/
本指南将引导您完成使用Spring 创建“hello world” RESTful Web服务的过程。

你会建立什么

您将在以下位置构建一个将接受HTTP GET请求的服务:

http://localhost:8080/greeting

并用一个问候的JSON表示来回应:

{"id":1,"content":"Hello, World!"}

您可以使用name查询字符串中的可选参数来自定义问候语:

http://localhost:8080/greeting?name=User

该name参数值覆盖的“世界”的默认值,并反映在响应:

{"id":1,"content":"Hello, User!"}

你需要什么

  • 大约15分钟
  • 最喜欢的文本编辑器或IDE

  • JDK 1.8或更高版本

  • Gradle 2.3+或Maven 3.0+

  • 您还可以直接将代码导入到您的IDE中:

    • Spring工具套件(STS)

    • IntelliJ IDEA

用Gradle构建

首先你建立一个基本的构建脚本。在使用Spring构建应用程序时,您可以使用任何构建系统,但您需要使用Gradle和Maven的代码。如果您不熟悉这两者,请参阅使用 Gradle 构建Java项目或使用Maven构建Java项目。

创建目录结构
在您选择的项目目录中,创建以下子目录结构; 例如,使用mkdir -p src/main/java/helloon * nix系统:

└── src
    └── main
        └── java
            └── hello

创建一个Gradle构建文件
以下是最初的Gradle构建文件。

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-rest-service'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

在spring boot的Gradle启动插件提供了许多便捷的功能:

它收集类路径上的所有jar,并构建一个可运行的“über-jar”,这使得执行和传输服务更为方便。

它搜索public static void main()标记为可运行类的方法。

它提供了一个内置的依赖关系解析器,用于设置版本号以匹配Spring Boot依赖关系。你可以覆盖你想要的任何版本,但是它会默认使用Boot的选择版本。

创建一个资源表示类

现在您已经设置了项目和构建系统,您可以创建您的Web服务。

考虑服务交互开始流程。

该服务将处理GET请求

/greeting

,可选地name在查询字符串中使用参数。该GET请求应该200 OK在表示问候的正文中返回带有JSON 的响应。它应该看起来像这样:

{
    "id": 1,
    "content": "Hello, World!"
}

该id字段是问候语的唯一标识符,并且content是问候语的文字表示。

为了对问候表示进行建模,您可以创建一个资源表示类。提供字段,构造,和用于存取一个普通的旧java对象id和content数据:

src/main/java/hello/Greeting.java

package hello;

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;
    }
}

正如您在下面的步骤中看到的那样,Spring使用Jackson JSON库自动将类型实例编组Greeting为JSON。

接下来,您将创建将提供这些问候的资源控制器。

创建一个资源控制器

在Spring构建RESTful Web服务的方法中,HTTP请求由控制器处理。这些组件很容易通过@RestController注释来识别,GreetingController下面的处理GET请求/greeting通过返回类的新实例Greeting:

src/main/java/hello/GreetingController.java

package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
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();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

这个控制器简洁明了,但有很多内容正在发挥。让我们一步一步分解它。

所述@RequestMapping注释可以确保HTTP请求/greeting被映射到greeting()方法。

上面的例子没有指定GETvs PUT,POST等等,因为@RequestMapping默认映射所有的HTTP操作。使用@RequestMapping(method=GET)缩小这种映射。
@RequestParam将查询字符串参数的值绑定name到方法的name参数中greeting()。此查询字符串参数明确标记为可选(required=true默认情况下):如果请求中不存在,defaultValue则使用“World”。

方法主体的实现基于下一个值创建并返回一个Greeting带有id和content属性的新对象,并使用问候语counter格式化给定name的对象template。

传统的MVC控制器和上面的RESTful Web服务控制器之间的一个主要区别在于HTTP响应主体的创建方式。这个RESTful Web服务控制器并不依赖视图技术来执行将问候数据的服务器端呈现给HTML,而是简单地填充并返回一个Greeting对象。对象数据将作为JSON直接写入HTTP响应。

这段代码使用Spring 4的新@RestController注释,它将类标记为控制器,其中每个方法都返回一个域对象而不是视图。这是速记@Controller和@ResponseBody汇总。

该Greeting对象必须转换为JSON。由于Spring的HTTP消息转换器支持,您不需要手动执行此转换。因为Jackson 2在类路径上,Spring的MappingJackson2HttpMessageConverter会自动选择将Greeting实例转换为JSON。

使应用程序可执行

虽然可以将此服务作为传统WAR文件打包以部署到外部应用程序服务器,但下面演示的更简单的方法会创建独立应用程序。您可以将所有内容打包到一个单独的,可执行的JAR文件中,并由一个优秀的Java main()方法驱动。一路上,您使用Spring的支持将Tomcat servlet容器作为HTTP运行时嵌入,而不是部署到外部实例。

src/main/java/hello/Application.java

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication 是一个方便的注释,它增加了以下所有内容:

@Configuration 将该类标记为应用程序上下文的bean定义的来源。

@EnableAutoConfiguration 告诉Spring Boot开始添加基于类路径设置,其他bean和各种属性设置的bean。

通常你会添加@EnableWebMvc一个Spring MVC应用程序,但Spring Boot会在类路径中看到spring-webmvc时自动添加它。这将该应用程序标记为Web应用程序并激活关键行为,例如设置一个DispatcherServlet。

@ComponentScan告诉Spring在包中查找其他组件,配置和服务hello,以便找到控制器。

该main()方法使用Spring Boot的SpringApplication.run()方法启动应用程序。你有没有注意到没有一行XML?没有web.xml文件。这个Web应用程序是100%纯Java,您不必处理配置任何管道或基础设施。

构建一个可执行的JAR

您可以使用Gradle或Maven从命令行运行应用程序。或者您可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,并运行该文件。这使得在整个开发生命周期内跨越不同环境等,将服务作为应用程序发布,版本化和部署变得非常容易。

如果您正在使用Gradle,则可以使用运行该应用程序./gradlew bootRun。或者你可以使用构建JAR文件./gradlew build。然后你可以运行JAR文件:

java -jar build / libs / gs-rest-service-0.1.0.jar
如果你正在使用Maven,你可以使用运行该应用程序./mvnw spring-boot:run。或者您可以使用构建JAR文件./mvnw clean package。然后你可以运行JAR文件:

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服务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值