原文地址

构建一个RESTful的WebService

这个指南将带你用Spring创建一个RESTful的helloworld程序。

你将完成

在下面地址上创建一个接收http get请求的服务

  1. http://localhost:8080/greeting

返回json格式的数据

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

自定义可选参数name作为请求参数

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

name的值会替换World然后返回结果

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

你需要的

  • 大约15分钟
  • 你喜欢的文本编辑器(我这里用了vscode)或者IDE
  • jdk1.8+
  • Gradle 4+ 或 Maven 3.2+
  • 你也可以直接把你的代码导入到你的ide中
    • Spring Tool Suite
    • IntelliJ IDEA

如何完成这份指南

其他的不说了,一步一步来,直接看通过Maven

通过Gradle

忽略~~

通过Maven

这里演示如何用Maven来构建你的spring应用,如果你不熟悉怎么使用Maven,可以看这里

创建项目结构:

mkdir -p src/main/java/hello

然后定义pom.xml文件。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>org.springframework</groupId>
  6. <artifactId>gs-rest-service</artifactId>
  7. <version>0.1.0</version>
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.0.5.RELEASE</version>
  12. </parent>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-test</artifactId>
  21. <scope>test</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.jayway.jsonpath</groupId>
  25. <artifactId>json-path</artifactId>
  26. <scope>test</scope>
  27. </dependency>
  28. </dependencies>
  29. <properties>
  30. <java.version>1.8</java.version>
  31. </properties>
  32. <build>
  33. <plugins>
  34. <plugin>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-maven-plugin</artifactId>
  37. </plugin>
  38. </plugins>
  39. </build>
  40. </project>

有几点可以说一下:

  • 第一是固定的modelVersion=4.0
  • 第二是几个groupId都是org.springframework.boot,这个我们一般写自己的公司或者组织相关的倒序域名,这里因为是spring自己的教程,所以都是一样的org.springframework.boot。
  • spring-boot-starter-parent提供了依赖和插件管理的功能。spring-boot-starter-web用于构建restful的webapi以及springmvc应用。,spring-boot-starter-test用于测试,包含了JUnit,Hamcrest,Mockito。这3个包算是完整的项目基本上都要用到的。
  • 然后是spring-boot-maven-plugin插件。他提供了很多便捷的特性。
    • 把用到的所有依赖打包成一个整体,这样方便服务的执行以及分发。
    • public static void main()标记成可执行类。
    • 提供了内置的依赖解析器用于设置相符的Spring Boot依赖的版本号。

通过IDE

介绍了如何使用intellij IDEA,占个位,忽略先。

创建一个资源表示类

定义好了pom就可以开始写代码了。

先想一下服务的交互是怎么样的。

服务处理/greeting过的来的get请求,可能会有一个name参数。然后结果返回一个json以及200状态码。json如下。

  1. {
  2. "id": 1,
  3. "content": "Hello, World!"
  4. }

id字段作为一个唯一表示符,content表示内容。

下面创建一个java类来表示这个类。包含字段,构造函数,两个get方法。src/main/java/hello/Greeting.java

  1. package hello;
  2. public class Greeting {
  3. private final long id;
  4. private final String content;
  5. public Greeting(long id, String content) {
  6. this.id = id;
  7. this.content = content;
  8. }
  9. public long getId() {
  10. return id;
  11. }
  12. public String getContent() {
  13. return content;
  14. }
  15. }

Spring 使用Jackson Json库把对象转换成JSON。

接下来创建控制器。

创建一个资源控制器

Spring用控制器来处理HTTP请求。用@RestController注解来标识。@RequestMapping注解申明请求路径/greeting,然后返回一个Greeting的实例。下面示例代码。

src/main/java/hello/GreetingController.java

  1. package hello;
  2. import java.util.concurrent.atomic.AtomicLong;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class GreetingController {
  8. private static final String template = "Hello, %s!";
  9. private final AtomicLong counter = new AtomicLong();
  10. @RequestMapping("/greeting")
  11. public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
  12. return new Greeting(counter.incrementAndGet(),
  13. String.format(template, name));
  14. }
  15. }

这个控制器看起来比较简单,但其实里面有很多东西,让我们一步一步来看看。

@RequestMapping注解使/greeting过来的HTTP请求映射到greeting()方法。

上面的@RequestMapping方法注解里面没有指定get或者put或者post,所以,默认是接收所有方法。如果需要,可以按如下指定为只接收get方法@RequestMapping(method=GET)

@RequestParam把请求过来的name参数绑定到方法的name参数上,如果没有传值,默认用defaultValue指定的world

返回的Greeting对象的idcounter构造,contenttemplate构造。

与传统的MVC 里面的控制器对比,RESTful服务的HTTP请求的Response由控制器直接返回一个Greeting对象,而传统的MVC里面的控制器还需要依赖视图渲染技术进行服务端的渲染技术返回html。

代码使用Spring 4的@RestController注解,把类标记成控制器并且返回领域对象而不是一个视图。可以算是@Controller@ResponseBody的合体。

Greeting对象需要转换成json对象。Spring使用MappingJackson2HttpMessageConverter选择Jackson2作为默认的库把Greeting对象转成json。

使你的程序可运行

虽然把程序打包成一个war文件,然后部署到外部的服务器是可行的。下面演示一种更简单的方式。把程序打包成一个可执行的jar文件,通过main()方法驱动。通过这种方式,使用Tomcat服务器来托管http运行时。

创建src/main/java/hello/Application.java

  1. package hello;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

什么是bean。简单来说是由Spring的 IoC容器控制的,并且是程序的骨架。

@SpringBootApplication是一个简便的注解,它添加了下面这些东西:

  • @Configuration 定义这个类是bean的来源类。
  • @EnableAutoConfiguration 告诉SpringBoot去添加基于classpath设置的或者是其他的bean,以及各种属性。
  • 通常你可能会添加@EnableWebMvc注解在Spring MVC程序中。但是SpringBoot会自动为你添加,如果在classpath里面有spring-webmvc。这个标记把程序标记成web应用。激活并设置比如DispatcherServlet之类的核心行为。
  • @ComponentScan告诉Sping 去查找hello包里面的其他的组件,配置服务,包括控制器。

mian()方法使用SpingBoot的 SpringApplication.run()方法来启动应用。是的,没有写xml配置,这是一个纯粹的java程序。

编译生成可执行的jar

你可以通过命令行的Maven或者Gradle来运行程序。或者你可以把程序编译生成一个可执行的jar文件。这个jar文件包含了必须的依赖,类,资源文件。这方便于分发部署。

mvn spring-boot:run命令来运行程序。

mvn clean package 命令来打包程序生成jar。然后使用

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

来运行。第一次需要要从Maven下载dependency,所以package过程有点长。。。喝杯☕️。

试试这个服务

启动默认是8080端口。访问http://localhost:8080/greeting,将会看到

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

提供一个name参数http://localhost:8080/greeting?name=User,content就会变掉。

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

总结

恭喜,你已经学会~。

[SpringBoot guides系列翻译]SpringBoot构建RESTful程序入门的更多相关文章

  1. [SpringBoot guides系列翻译]调用RESTfulWebService

    原文 参考链接 CommandLineRunner Bean 翻译如何调用RESTful WebService 这节将演示如何在SpringBoot里面调用RESTful的WebService. 构建 ...

  2. [SpringBoot guides系列翻译]通过JDBC和Spring访问关系数据库

    原文 参考链接 hikaricp Spring Boot JDBC Starter Spring Boot Starter Parent h2 database introduction Autowi ...

  3. [SpringBoot guides系列翻译]调度任务

    原文 调度任务 用spring实现一个任务调度. 你将做的 你将做一个应用每5秒钟打印当前时间,用@Scheduled注解. 你需要啥 15分钟 文本编辑器或者IDE JDK1.8+ Gradle4+ ...

  4. [SpingBoot guides系列翻译]文件上传

    文件上传 这节的任务是做一个文件上传服务. 概况 参考链接 原文 thymeleaf spring-mvc-flash-attributes @ControllerAdvice 你构建的内容 分两部分 ...

  5. Python图形编程探索系列-05-用控制变量构建对话程序

    跳转到自己的博客 控制变量 变量 符号 意义 默认值 1 var = tk.BooleanVar() 布尔型 0 2 var = tk.StringVar() 字符串控制变量 空字符串 3 var = ...

  6. [SpingBoot guides系列翻译]Redis的消息订阅发布

    Redis的消息 部分参考链接 原文 CountDownLatch 概述 目的 这节讲的是用Redis来实现消息的发布和订阅,这里会使用Spring Data Redis来完成. 这里会用到两个东西, ...

  7. 用springMVC构建restful程序,接收以及返回json数据格式

    主要参考文章:http://kingxss.iteye.com/blog/1487745和http://blog.csdn.net/greensurfer/article/details/192962 ...

  8. jersey+maven构建restful服务

    一.新建一个Maven Web项目 a) 新建一个简单的Maven项目 b) 将简单的Maven项目转成Web项目 (若没出现further configuration available--或里面的 ...

  9. Springboot & Mybatis 构建restful 服务五

    Springboot & Mybatis 构建restful 服务五 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务四 2 restful ...

随机推荐

  1. 配置(迁移)Laravel的注意事项

    1.如果Laravel是在Linux下运行,如果权限不足,会报错 2.如果是从git上clone下来的项目,需要安装composer,切到项目根目录下 composer install compose ...

  2. Oracle系列-锁表与解锁解决方案(基础版)

    [Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...

  3. Protobuf 语言指南(proto3)

    Protobuf 语言指南(proto3) Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数 ...

  4. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

  5. 【递归打卡2】求两个有序数组的第K小数

    [题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...

  6. Android版数据结构与算法(六):树与二叉树

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接 ...

  7. 金三银四,如何征服面试官,拿到Offer

    又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁 ...

  8. 第14章 纪元时间转换 - IdentityModel 中文文档(v1.0.0)

    JWT令牌使用所谓的Epoch或Unix时间来表示日期/时间. IdentityModel包含用于DateTime和DateTimeOffset转换到/来自Unix时间的扩展方法: var dt = ...

  9. Python猜数小游戏

    使用random变量随机生成一个1到100之间的数 采集用户所输入的数字,如果输入的不符合要求会让用户重新输入. 输入符合要求,游戏开始.如果数字大于随机数,输出数字太大:如果小于随机数,输出数字太小 ...

  10. Vscode新建html文件

    在Vscode新建html文件 1.点击Open Folder: 2.选择目标文件夹,新建一个拓展名为html的文件: 3.在第1行输入!(英文状态下),按tab键,新建成功.界面如下图所示: