使用Spring Boot和RxJava的构建响应式REST API
点击蓝色“程序猿DD”关注我
回复“资源”获取独家整理的学习资料!
我不打算解释什么是响应式编程
,也不解释为什么要使用它。我希望你已经在其他地方了解过,如果没有,你可以使用Google
去搜索它。在本文中,我将告诉您如何使用专门针对Spring Boot
和RxJava
的响应式编程。让我们开始吧。
1.预备知识
在你继续阅读之前,我希望你能理解如何使用Spring Boot
和RxJava
创建简单的REST API
。如果不能,你可以在Baeldung
上了解更多关于Spring Boot
的知识,也可以在AndroidHive
上了解更多关于RxJava
的知识。它们很好地解释了这两种技术。
2.响应式REST API
构建一个只包含作者和书籍的简单CRUD
响应式REST API
。这些是端点:
[POST] /api/authors → 添加作者
[POST] /api/books → 添加书籍
[PUT] /api/books/{bookId} → 根据书籍id更新书籍信息
[GET] /api/books?limit={limit}&page={page} → 分页获取书籍列表
[GET] /api/book/{bookId} → 根据书籍id获取书籍详细信息
[DELETE] /api/book/{bookId} → 删除书籍
3.依赖
打开pom.xml并添加如下依赖项。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.1.5.RELEASE</version> </dependency> <dependency> <groupId>io.reactivex</groupId> <artifactId>rxjava</artifactId> <version>1.3.8</version> </dependency> <!--IMPORTANT!!! ADD THIS DEPENDENCY TO SOLVE HttpMediaNotAcceptableException--> <dependency> <groupId>io.reactivex</groupId> <artifactId>rxjava-reactive-streams</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.199</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <version>1.18.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.1.5.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.25.0</version> <scope>test</scope> </dependency> </dependencies>
备注:请记住,您必须添加第19-23行依赖项。如果您不添加该依赖项,那么每次您点击响应式API时都会得到HttpMediaNotAcceptableException
。如您所见,我还添加了mockito
作为单元测试中mock对象的依赖项。但是我将在另一篇文章中讨论单元测试。
4.服务层
对于服务层,返回值不仅仅是常规数据类型,而是我将它们封装在RxJava
的Single
(单一)数据类型中。例如,下面的代码处理新书的添加。
@Override public Single<String> addBook(AddBookRequest addBookRequest) { return saveBookToRepository(addBookRequest); } private Single<String> saveBookToRepository(AddBookRequest addBookRequest) { return Single.create(singleSubscriber -> { Optional<Author> optionalAuthor = authorRepository.findById(addBookRequest.getAuthorId()); if (!optionalAuthor.isPresent()) singleSubscriber.onError(new EntityNotFoundException()); else { String addedBookId = bookRepository.save(toBook(addBookRequest)).getId(); singleSubscriber.onSuccess(addedBookId); } }); } private Book toBook(AddBookRequest addBookRequest) { Book book = new Book(); BeanUtils.copyProperties(addBookRequest, book); book.setId(UUID.randomUUID().toString()); book.setAuthor(Author.builder() .id(addBookRequest.getAuthorId()) .build()); return book; }
正如您所看到的,addBook
方法的返回值是一个封装在RxJava
中的字符串。
5.web层
@PostMapping( consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE ) public Single<ResponseEntity<BaseWebResponse>> addBook(@RequestBody AddBookWebRequest addBookWebRequest) { return bookService.addBook(toAddBookRequest(addBookWebRequest)) .subscribeOn(Schedulers.io()) .map(s -> ResponseEntity.created(URI.create("/api/books/" + s)).body(BaseWebResponse.successNoData())); } private AddBookRequest toAddBookRequest(AddBookWebRequest addBookWebRequest) { AddBookRequest addBookRequest = new AddBookRequest(); BeanUtils.copyProperties(addBookWebRequest, addBookRequest); return addBookRequest; }
在web层中,它只是将请求转发给相应的服务,如上所示,用于处理新书的添加。
6.结束
整个代码(+单元测试)可以在GitHub上找到。
由SpringForAll社区核心成员维护,专注于收集国外优质、前沿好文,带大家了解锅外大佬们都在搞啥,有什么独到观点!
留言交流不过瘾?添加微信:zyc_enjoy
根据指引加入各种主题讨论群
阿里程序员推荐的15 款常用开发者工具
一文学会Maven私服的搭建
真实的上海IT圈:张江男vs漕河泾男
IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
Java 程序员常用的 22 个Linux命令
点一点“阅读原文”小惊喜在等你
使用Spring Boot和RxJava的构建响应式REST API相关推荐
- Spring Boot 中使用 Swagger2 构建强大的 RESTful API 文档
项目现状:由于前后端分离,没有很好的前后端合作工具. 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型.HTTP头部信息.HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下 ...
- Spring Boot中使用Swagger2构建强大的RESTful API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
- Spring Boot 实践折腾记(11):使用 Spring 5的WebFlux快速构建效响应式REST API
关于Spring 5中的反应式编程支持Reactor类库,上一篇文章< Spring Boot 实践折腾记(10):2.0+版本中的反应式编程支持--Reactor>已经简要介绍过,Spr ...
- Spring Boot中使用Swagger2构建RESTful APIs
关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. S ...
- java Spring Boot中使用Swagger2构建API文档
1.添加Swagger2的依赖 在pom.xml中加入Swagger2的依赖 <dependency><groupId>io.springfox</groupId> ...
- 分享九款构建响应式网站的最佳PHP框架
目前,网上有大量的框架供大家选择,本文作者分享了9款各方面都兼具优势的PHP框架,主要用来构建响应式网站,开发人员可以根据自己的需求来选择下面的某一个框架. 1.Symfony 2 Symfony是一 ...
- vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...
介绍 BootStrap是世界上最受欢迎的构建响应式移动优先网站的框架,Vue是当前最流行的前端框架之一,BootstrapVue则是将两者相结合,使用BootstrapVue,可以使用Vue.js和 ...
- www.how2j.com_HOW-TO:快速开始使用Spring 4.0,以构建简单的REST-Like API(演练)
www.how2j.com HOW-TO:快速开始使用Spring 4.0,以构建简单的REST-Like API(演练) 关于使用Spring MVC创建Web API的另一篇教程. 不太复杂. 只 ...
- Skeljs – 用于构建响应式网站的前端开发框架
skelJS 是一个轻量级的前端框架,用于构建响应式站点和应用程序.让设计人员和开发人员可能够使用四个强大的组件:CSS 网格系统,响应式处理程序,CSS 的快捷方式和插件系统. 您可能感兴趣的相关文 ...
最新文章
- 是什么造成了网管员的低工资?
- 趣谈网络协议笔记-二(第六讲)
- 小甲鱼-013元组tuple:上了枷锁的列表
- 暴力求解法 之 枚举排列
- Android底层网络防火墙,详解Android 利用Iptables实现网络黑白名单(防火墙)
- word转换成pdf java代码_java代码实现word转换成pdf
- 动态规划入门之国王的金矿
- mysql 字符串枚举类型转换_MyBatis里字段到枚举类型的转换/映射
- Js中apply和Math.max()函数的问题及区别
- 回声消除原理(AEC)
- 压缩文件解压密码破解之fcrackzip
- 网站跳出率高怎么解决?
- 有权最短路径问题:狄克斯特拉(Dijkstra)算法 Java 实现
- 10 个快速提升技术水平的方法
- 百万调音师—Audition多轨编辑
- matlab RBF神经网络对iris鸢尾花数据集进行分类
- 简单五步看懂伦敦的银标
- Python爬虫实战之电影爬取过程
- c语言是流式,C语言中的文件又被称为流式文件。
- 【Sql Server】查询实战,实现不同班级的排行查询并且批量模拟数据进行查询测试