2.Spring构建REST Web Service

1. 你将会建立什么?

Tips: 上面已经提到,我们将使用Spring创建一个“Hello World”REST Web服务的过程,但是最终的效果是什么样呢?

我们将构建一个接受HTTP GET请求的服务:

http://localhost:8080/greeting

当我们发出上面的Http Get 请求后,会响应返回下面的JSON 内容。

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

我们也可以带一个参数进行请求

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

 Name参数值重写“Word”的默认值,并反映在响应中:

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

2. 你将需要准备什么?

3.如何完成本指南?

像大多数Spriing 入门指南一样,你可以从头开始,完成每一步,或者你可以绕过已经熟悉的基本设置步骤。不管怎样,你最终都会得到工作代码

3.1 获取工作代码

  a.使用Maven构建

  b. 使用Gradle构建

  c. 使用IDE构建

  d.  点击下载 然后 解压仓库源码

  e. 使用git 克隆

git clone https://github.com/spring-guides/gs-rest-service.git

上面有五种方法,但是由于之后我们会经常使用IDE来完成这些操作,所以这里我们使用IDE 来构建入门指南项目

3.1.1 用STS开始入门指南

本指南引导您使用Spring工具套件(STS)构建一个入门指南

3.1.1.1 你将会构建什么?

您将选择Spring指南并将其导入Spring Tool Suite。然后你可以阅读指南,处理代码,运行项目。

3.1.1.2 你需要什么?

3.1.1.3 安装STS

   如果你还没有安装STS,请访问上面的链接。从那里,您可以下载一个副本为您的平台。要安装它,只需解压缩下载的存档文件。

   当你完成后,继续登陆 STS

3.1.1.4 导入入门指南

   使用STS启动并运行,从文件菜单打开Import Spring Getting Started Content 向导。

 点击File ——> New ————> Import Spring Geting Started Content

然后会弹出来一个窗口向导,将为您提供从Spring网站搜索和挑选任何已发布指南的机会。

你可以浏览列表,或者输入搜索词来立即过滤选项。

当提供即时搜索结果时,该标准适用于标题和描述。支持通配符。

输入rest ,选择 Rest Service ,点击Finish 

 

您可以选择Maven或Gradle作为构建系统来使用。

您还可以决定是否抓取初始代码集、完成代码集,或两者兼而有之。

对于大多数项目,

  • (initial)初始代码集是一个空的项目,使得您可以通过指南复制和粘贴您的方式
  •   (Complete)完整的代码集是来自已经进入的指南的所有代码。如果你抓住这两个,你可以比较你的工作与指南的差异。

最后,你可以让STS向网站上的指南打开浏览器标签。这会让你在不离开STS的情况下通过向导工作。

 STS将在您的工作区中创建两个新项目,导入消耗REST代码库(初始和完整),并在STS中打开浏览器选项卡,如下所示:

 

Tips: 

gs-rest-service-complete 是完成后的项目

gs-rest-service-initial 是初始化一个空的项目

3.1.2 用Intellij Idea 开始入门指南

 本指南指导您使用Intellij Idea 构建一个入门指南。

3.1.2.1 你将会构建什么?

你会选择一个Spring指南并导入到iTeliJ的想法中。然后你可以阅读指南,处理代码,运行项目。

3.1.2.2 你需要准备什么?

3.1.2.3 安装 IntelliJ IDEA

如果你还没有安装 IntelliJ IDEA (Ultimate Edition) ,请访问上面的链接。从那里,您可以下载一个副本为您的平台。要安装它,只需解压缩下载的存档文件。

 当你完成后,继续启动Intellij IDEA

3.1.2.4 导入入门指南

要导入现有的项目,需要一些代码,

点击下载

或者使用Git 克隆或复制其中一个入门指南,例如REST服务指南:

git clone https://github.com/spring-guides/gs-rest-service.git

下载解压后如图所示

使用Intellij IDEA 启动和运行,点击欢迎屏幕上的导入项目,或在主菜单上打开文件:

 在弹出对话框中,确保在完整文件夹下选择Maven的POM.xml或Gradle的build.gradle文件:

这里我们选择build.gradle

Intellij IDEA 将创建一个项目,所有的代码从指南准备运行。

保持默认,点击OK

构建完成后如图所示

3.2 创建资源表示类

 既然已经建立了项目并建立了系统,就可以创建Web服务。

 通过考虑服务交互来开始这个过程。

服务将处理查询t /greeting  GET 请求,可选地在查询字符串中使用name参数。GET请求应该返回一个200 OK响应,其中JSON在表示greetin的主体中。它应该看起来像这样:

{
    "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库自动将问候类型的实例封送到JSON中。

 接下来,创建将为这些问候服务的资源控制器。

3.3 创建资源Controller

在Spring构建REST Web服务的方法中,HTTP请求由控制器处理。这些组件很容易被@ RESTController注释标识,下面的GreetingController通过返回Greeting 类的新实例来处理GET请求/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()方法。

上面的示例不指定GET、PUT、POST等等,因为@RequestMapping 默认映射所有HTTP操作。使用@RequestMapping(Method= GET)来缩小此映射。

@RequestParam将查询字符串参数name 的值绑定到greeting()方法的name参数中。 如果请求中缺少name参数,则使用“World”的默认值。

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

 

传统的MVC控制器和上面的RESTful Web服务控制器之间的一个主要区别在于HTTP响应主体的创建方式。

这个RESTful Web服务控制器只需填充并返回一个Greeting对象,而不是依赖视图技术将问候数据的服务器端呈现呈现给HTML。

对象数据将作为JSON直接写入HTTP响应。

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

@RestController = = @Controller + @ResponseBody 

Greeting对象必须转换为JSON。 由于Spring的HTTP消息转换器支持,您不需要手动执行此转换。

由于Jackson 2位于classpath中,因此会自动选择Spring的MappingJackson2HttpMessageConverter将Greeting实例转换为JSON。

3.4 使应用程序可执行

虽然可以将此服务作为传统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。
  • 通常你会为Spring MVC应用程序添加@EnableWebMvc,但Spring Boot在类路径中看到spring-webmvc时会自动添加。 这将该应用程序标记为Web应用程序并激活关键行为,例如设置DispatcherServlet。
  • @ComponentScan告诉Spring在hello包中查找其他组件,配置和服务,以便找到控制器。

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

3.5 构建一个可执行的JAR

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

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

java -jar build/libs/gs-rest-service-0.1.0.jar

如果您使用的是Maven,则可以使用./mvnw spring-boot:run来运行该应用程序。 或者,您可以使用./mvnw clean包构建JAR文件。 然后你可以运行JAR文件:

java -jar target/gs-rest-service-0.1.0.jar

上述过程将创建一个可运行的JAR。 您也可以选择构建经典的WAR文件。

记录输出显示。 该服务应该在几秒钟内启动并运行。

3.6 测试 service

 现在这个service已经启动,我们访问 http://127.0.0.1:8080/greeting 你将会看到这样的结果

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

提供一个name参数进行查询,访问 http://localhost:8080/greeting?name=User

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

注意content 文本内容已经从 "Hello ,World!" 变成了" Hello, User!"

此更改演示了GreetingController中的@RequestParam排列按预期工作。 name参数已被赋予默认值“World”,但始终可以通过查询字符串显式覆盖。

还要注意id属性如何从1更改为2.这证明您正在针对多个请求中的同一个GreetingController实例工作,并且它的计数器字段按照预期在每次调用时递增。

恭喜! 您刚刚用Spring开发了一个RESTful Web Service。

http://www.q-wei.cn/
http://news.q-wei.cn/
http://www.yichaonet.cn/
http://news.yichaonet.cn/
http://www.vxjezfv.cn/
http://news.vxjezfv.cn/
http://www.xibiyo.com.cn/
http://news.xibiyo.com.cn/
http://www.9208361.org.cn/
http://news.9208361.org.cn/
http://www.9111316.cn/
http://news.9111316.cn/
http://www.bluelf.com.cn/
http://news.bluelf.com.cn/
http://www.qqq136com.cn/
http://news.qqq136com.cn/
http://www.2819w.cn/
http://news.2819w.cn/
http://www.9019758.org.cn/
http://news.9019758.org.cn/
http://www.wydaogou.cn/
http://news.wydaogou.cn/
http://www.ralhys.cn/
http://news.ralhys.cn/

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页