通过Spring构建RESTful Web Service

作者: Haocheng | 来源:发表于2017-01-24 23:28 被阅读1075次

    以下教程翻译自Spring官方网站(spring.io), 原文名(Building a RESTful Web Service), 原文引用地址请查看(http://spring.io/guides).

    本教程将指引你通过Spring来快速构建一个RESTful Web Service的"hello world"工程.

    目标:
    构建的服务将从此地址接收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!"
    }
    

    你需要:
    大概15分钟时间
    准备好你最喜欢的编辑器或IDE
    JDK 1.8以上版本
    Gradle 2.3+或Maven 3.0+
    你也可以使用Spring Tool Suite(STS)直接从此网页导入代码

    如何完成此教程
    就和其他Spring起步教程一样, 你既可以从头开始构建整个项目, 或者跳过一些你已非常熟悉的基础部分. 不论怎样你都将编写代码以完成项目.

    从头开始, 前往使用Gradle构建.

    如果想要跳过一些基础部分, 按照下面的方式做:
    下载并解压本教程源代码或使用Git工具:

    git clone https://github.com/spring-guides/gs-rest-service.git
    cd into gs-rest-service/initial
    跳到创建资源表示class一节
    

    创建一个资源表示class
    现在你应该已经设置好了项目和构建系统, 可以开始创建web service了.

    首先思考service是如何互动的.

    service处理提交到/greeting的GET请求, 或许带有name参数的查询字符串(原文: Query String). GET请求应该返回JSON格式的问候响应. 看起来像这样:

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

    对于每个问候id字段都是唯一的标识符, 而content字段则是表示问候的文本内容.

    现在创建一个资源表示class为这个问候建模. 编写一个POJO类和相应字段, 构造器, 设置器等:

    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 services服务, 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注解确保对/greeting的HTTP请求确实被映射到了greeting()方法.

    上面这个例子并未明确GET, PUT和POST等等这些提交方法, 因为默认情况下@RequestMapping映射所有的HTTP操作. 使用@RequestMapping(method=GET)可以缩小映射范围.
    

    @RequestParam将查询字符串中的name参数的值绑定到greeting()方法的参数name上. 这个查询字符串参数是显式的标识为可选项(required=true by default), 如果没有指定此参数则默认值为"World".

    在方法体中构建并返回了一个新的Greeting对象, id字段被初始化为从counter获得的, 下一个值, content字段则使用给定的name参数格式化为相应的问候语.

    RESTful Web Service控制器和传统的MVC控制的的主要不同之处在于HTTP响应创建的方式. 与其依靠某种视图技术获得服务端的问候数据并最终经由HTML呈现, RESTful web service控制器直接填充并返回一个Greeting对象, 对象数据将以JSON格式直接写入HTTP响应中.

    这段代码使用了最新的Spring 4中的@RestController注解, 这个注解标识了这个类下的所有方法均返回一个域对象(domain object)而非一个视图. 也相当于同时有@Controller和@ResponseBody两个注解的简写.

    Greeting对象必须装换为JSON格式, 有了Spring的HTTP消息装换的支持就不用你手工编码完成装换了. 我们现在有Jackson 2在类路径下, Spring的MappingJacksonHttpMessageConverter将自动完成转换.

    让程序开始运行

    尽管也可以将程序打包为传统的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应用程序中都会用到@EnableMvc注解, 但Spring Boot自动的在类路径下寻找spring-webmvc的类并自动注解为@EnableMvc. 这标志着此应用是Web应用程序, 且激活了多个关键行为, 如设置了DispatcherServlet.

    @ComponentScan告诉Spring在hello这个包中寻找其他组件, 设置和服务, 允许找到控制器.

    main()方法使用了Spring Boot的SpringApplication.run()方法启动整个应用程序. 你注意到没有一行XML了吗? web.xml也没有哦. 这个Web应用程序是100%有Java写成的, 你完全不必配置任何龟毛.

    生成可执行的JAR
    你可以通过Gradle或Maven在命令行来启动应用程序. 或者你也可以构建一个单独的可执行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":"Hello, World!"
    }
    

    提供一个查询字符串参数 http://localhost:8080/greeting?name=User. 注意content属性的值将从"Hello World!"变为"Hello, User!".

    这个改变展示了@RequestParam注解对Greeting控制器所做的安排是预期的. name参数先被设置为默认的值"World", 之后也能被显式的指定参数而覆盖为查询字符串的值.

    注意id字段同样有1变为了2. 这证明了你经由不同的请求但依然在和同一个GreetingController实例打交道, 而且counter字段也随着每次调用递增了.

    摘要
    恭喜! 你已经通过Spring实现了一个RESTful风格的web service应用.

    This article are released with an ASLv2 license for the code, an Attribution NoDerivatives creative commons license for the writing.

    相关文章

      网友评论

        本文标题:通过Spring构建RESTful Web Service

        本文链接:https://www.haomeiwen.com/subject/ooktittx.html