restful接口开发实例_Spring Boot 中 10 行代码构建 RESTful 风格应用
松哥原创的四套视频教程已经全部杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 RESTful 提供了很好的支持,常见的相关注解有:
@RestController@GetMapping@PutMapping@PostMapping@DeleteMapping@ResponseBody...
这些注解都是和 RESTful 相关的,在移动互联网中,RESTful 得到了非常广泛的使用。RESTful 这个概念提出来很早,但是以前没有移动互联网时,我们做的大部分应用都是前后端不分的,在这种架构的应用中,数据基本上都是在后端渲染好返回给前端展示的,此时 RESTful 在 Web 应用中基本就没用武之地,移动互联网的兴起,让我们一套后台对应多个前端项目,因此前后端分离,RESTful 顺利走上前台。
Spring Boot 继承自 Spring + SpringMVC, SpringMVC 中对于 RESTful 支持的特性在 Spring Boot 中全盘接收,同时,结合 Jpa 和 自动化配置,对于 RESTful 还提供了更多的支持,使得开发者几乎不需要写代码(很少几行),就能快速实现一个 RESTful 风格的增删改查。
接下来,松哥通过一个简单的案例,来向大家展示 Spring Boot 对于 RESTful 的支持。
实战
创建工程
首先创建一个 Spring Boot 工程,引入 Web
、 Jpa
、 MySQL
、Rest Repositories
依赖:
![](/assets/blank.gif)
创建完成后,还需要锁定 MySQL 驱动的版本以及加入 Druid 数据库连接池,完整依赖如下:
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-jpaartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-restartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>druid-spring-boot-starterartifactId> <version>1.1.10version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <scope>runtimescope> <version>5.1.27version> dependency>dependencies>
配置数据库
主要配置两个,一个是数据库,另一个是 Jpa:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.username=rootspring.datasource.password=rootspring.datasource.url=jdbc:mysql:///test01spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialectspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=updatespring.jpa.database-platform=mysqlspring.jpa.database=mysql
这里的配置,和 Jpa 中的基本一致。
前面五行配置了数据库的基本信息,包括数据库连接池、数据库用户名、数据库密码、数据库连接地址以及数据库驱动名称。
接下来的五行配置了 JPA 的基本信息,分别表示生成 SQL 的方言、打印出生成的 SQL 、每次启动项目时根据实际情况选择是否更新表、数据库平台是 MySQL。
这两段配置是关于 MySQL + JPA 的配置,没用过 JPA 的小伙伴可以参考松哥之前的 JPA 文章:http://www.javaboy.org/2019/0407/springboot-jpa.html
构建实体类
@Entity(name = "t_book")public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "book_name") private String name; private String author; //省略 getter/setter}public interface BookRepository extends JpaRepository<Book,Long> {}
这里一个是配置了一个实体类 Book,另一个则是配置了一个 BookRepository ,项目启动成功后,框架会根据 Book 类的定义,在数据库中自动创建相应的表,BookRepository 接口则是继承自 JpaRepository ,JpaRepository 中自带了一些基本的增删改查方法。
好了,代码写完了。
啥?你好像啥都没写啊?是的,啥都没写,啥都不用写,一个 RESTful 风格的增删改查应用就有了,这就是 Spring Boot 的魅力!
测试
此时,我们就可以启动项目进行测试了,使用 POSTMAN 来测试(大家也可以自行选择趁手的 HTTP 请求工具)。
此时我们的项目已经默认具备了一些接口,我们分别来看:
根据 id 查询接口
- http://127.0.0.1:8080/books/{id}
这个接口表示根据 id 查询某一本书:
![](/assets/blank.gif)
分页查询
- http://127.0.0.1:8080/books
这是一个批量查询接口,默认请求路径是类名首字母小写,并且再加一个 s 后缀。这个接口实际上是一个分页查询接口,没有传参数,表示查询第一页,每页 20 条数据。
![](/assets/blank.gif)
查询结果中,除了该有的数据之外,也包含了分页数据:
![](/assets/blank.gif)
分页数据中:
- size 表示每页查询记录数
- totalElements 表示总记录数
- totalPages 表示总页数
- number 表示当前页数,从0开始计
如果要分页或者排序查询,可以使用 _links 中的链接。http://127.0.0.1:8080/books?page=1&size=3&sort=id,desc
。
![](/assets/blank.gif)
添加
也可以添加数据,添加是 POST 请求,数据通过 JSON 的形式传递,如下:
![](/assets/blank.gif)
添加成功之后,默认会返回添加成功的数据。
修改
修改接口默认也是存在的,数据修改请求是一个 PUT 请求,修改的参数也是通过 JSON 的形式传递:
![](/assets/blank.gif)
默认情况下,修改成功后,会返回修改成功的数据。
删除
当然也可以通过 DELETE 请求根据 id 删除数据:
![](/assets/blank.gif)
删除成功后,是没有返回值的。
不需要几行代码,一个基本的增删改查就有了。
这些都是默认的配置,这些默认的配置实际上都是在 JpaRepository 的基础上实现的,实际项目中,我们还可以对这些功能进行定制。
查询定制
最广泛的定制,就是查询,因为增删改操作的变化不像查询这么丰富。对于查询的定制,非常容易,只需要提供相关的方法即可。例如根据作者查询书籍:
public interface BookRepository extends JpaRepository<Book,Long> { List findBookByAuthorContaining(@Param("author") String author);}
注意,方法的定义,参数要有 @Param 注解。
定制完成后,重启项目,此时就多了一个查询接口,开发者可以通过 http://localhost:8080/books/search 来查看和 book 相关的自定义接口都有哪些:
![](/assets/blank.gif)
查询结果表示,只有一个自定义接口,接口名就是方法名,而且查询结果还给出了接口调用的示例。我们来尝试调用一下自己定义的查询接口:
![](/assets/blank.gif)
开发者可以根据实际情况,在 BookRepository 中定义任意多个查询方法,查询方法的定义规则和 Jpa 中一模一样(不懂 Jpa 的小伙伴,可以参考干货|一文读懂 Spring Data Jpa!,或者在松哥个人网站 www.javaboy.org 上搜索 JPA,有相关教程参考)。但是,这样有一个缺陷,就是 Jpa 中方法名太长,因此,如果不想使用方法名作为接口名,则可以自定义接口名:
public interface BookRepository extends JpaRepository<Book, Long> { @RestResource(rel = "byauthor",path = "byauthor") List findBookByAuthorContaining(@Param("author") String author);}
@RestResource 注解中,两个参数的含义:
- rel 表示接口查询中,这个方法的 key
- path 表示请求路径
这样定义完成后,表示接口名为 byauthor ,重启项目,继续查询接口:
![](/assets/blank.gif)
除了 rel
和 path
两个属性之外,@RestResource
中还有一个属性,exported
表示是否暴露接口,默认为 true
,表示暴露接口,即方法可以在前端调用,如果仅仅只是想定义一个方法,不需要在前端调用这个方法,可以设置 exported
属性为 false
。
如果不想暴露官方定义好的方法,例如根据 id
删除数据,只需要在自定义接口中重写该方法,然后在该方法上加 @RestResource
注解并且配置相关属性即可。
public interface BookRepository extends JpaRepository<Book, Long> { @RestResource(rel = "byauthor",path = "byauthor") List findBookByAuthorContaining(@Param("author") String author); @Override @RestResource(exported = false) void deleteById(Long aLong);}
另外生成的 JSON 字符串中的集合名和单个 item
的名字都是可以自定义的:
@RepositoryRestResource(collectionResourceRel = "bs",itemResourceRel = "b",path = "bs")public interface BookRepository extends JpaRepository<Book, Long> { @RestResource(rel = "byauthor",path = "byauthor") List findBookByAuthorContaining(@Param("author") String author); @Override @RestResource(exported = false) void deleteById(Long aLong);}
path
属性表示请求路径,请求路径默认是类名首字母小写+s,可以在这里自己重新定义。
![](/assets/blank.gif)
其他配置
最后,也可以在 application.properties 中配置 REST 基本参数:
spring.data.rest.base-path=/apispring.data.rest.sort-param-name=sortspring.data.rest.page-param-name=pagespring.data.rest.limit-param-name=sizespring.data.rest.max-page-size=20spring.data.rest.default-page-size=0spring.data.rest.return-body-on-update=truespring.data.rest.return-body-on-create=true
配置含义,从上往下,依次是:
- 给所有的接口添加统一的前缀
- 配置排序参数的 key ,默认是 sort
- 配置分页查询时页码的 key,默认是 page
- 配置分页查询时每页查询页数的 key,默认是size
- 配置每页最大查询记录数,默认是 20 条
- 分页查询时默认的页码
- 更新成功时是否返回更新记录
- 添加成功时是否返回添加记录
总结
本文主要向大家介绍了 Spring Boot 中快速实现一个 RESTful 风格的增删改查应用的方案,整体来说还是比较简单的,并不难。相关案例我已上传到 GitHub 上了,小伙伴可以自行下载:https://github.com/lenve/javaboy-code-samples。
关于本文,有问题欢迎留言讨论。
今日干货
刚刚发表查看:13500回复:135
公众号后台回复 SpringBoot,免费获取 274 页SpringBoot修炼手册。
restful接口开发实例_Spring Boot 中 10 行代码构建 RESTful 风格应用相关推荐
- java restful接口开发实例_Spring Boot 中 10 行代码构建 RESTful 风格应用!
点击上方"Java后端技术",选择"置顶或者星标" 你关注的就是我关心的! 作者:江南一点雨 微信公众号:牧码小子(ID:a_javaboy) 推荐阅读:10个 ...
- restful接口开发实例_Restful接口开发与测试—接口测试
开发完接口,接下来我们需要对我们开发的接口进行测试.接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的Postman或者Jmeter ,Python脚本测试可 ...
- java restful接口开发实例_实战:基于Spring Boot快速开发RESTful风格API接口
写在前面的话 这篇文章计划是在过年期间完成的,示例代码都写好了,结果亲戚来我家做客,文章没来得及写.已经很久没有更新文章了,小伙伴们,有没有想我啊.言归正传,下面开始,今天的话题. 目标 写一套符合规 ...
- python中restful接口开发实例_Python RESTful接口开发02
什么是RESTful RESTful是一种设计思想,一种风格. RESTful主要包括 资源 和 对资源的操作. 资源: 对实体的抽象,图书.音乐.电影.学生等都属于资源. 对资源的操作: ===== ...
- 10 行代码构建常见目标检测应用
点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自OpenCV学堂. ImageAI介绍 纯Python的快速目标检测训练与测试平台,基于tensorflow+opencv构建,支持 Reti ...
- 实战:使用 Python 用不到 10 行代码计算汽车数量
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在这篇文章中,将教你如何使用 Python 用 10 行代码构建自 ...
- python编写restful接口_Python开发之路系列:RESTful 接口开发
这篇文章我们来看看在Flask里是如何进行RESTful接口开发的 按照我个人的理解,RESTful的核心价值再与它的规范性. RESTful接口是面向资源的, 而不是面向动作. 比如一个查书的接口, ...
- PHP支付宝微信个人免签即时到帐接口开发实例
PHP支付宝微信个人免签即时到帐接口开发实例,使用原生支付宝即时到帐接口修改而来,即可实现多接口收款功能,开发只需要按照支付宝即时到帐接口开发即可,减少开发难度 需要修改的文件:notify_url. ...
- 什么,PyTorch还能开发新药?哈佛推出这款工具包,10行代码训练“药神”模型...
萧箫 编辑整理 量子位 报道 | 公众号 QbitAI 最近,来自哈佛大学等机构的研究人员,开发出了一个AI"药神"工具包,为加速新冠疫情下的新药研发助力. 这款名为DeepPur ...
最新文章
- 百度信息流和搜索业务中的KV存储实践
- 《我想进大厂》之网络篇夺命连环12问
- 有跳板机时,如何使用sshfs挂载远程服务器文件夹
- git提交过滤package.json_eclipse配置git环境以及使用git提交本地仓和远程仓
- 【HDU - 2200】Eddy's AC难题(简单组合数学)
- UIBarbuttonItem
- Object类的用法(一)
- C++安全方向(三):3.6 SHA2原理分析和比特币挖矿,以及代码演示
- 揭露动画(Reveal Effect)实现时的注意事项(附上bug-logcat)...
- 【采访】腾讯社交广告高校算法大赛决赛第二周最大进步队伍——拔萝卜比赛经验及心得分享
- dreamweaver 8的替换功能
- 教你如何使用for循环来做一些小图案
- Ubuntu桌面生存指南:Linux 的哲学
- 问题3:filesystem:不是std的成员,filesystem:该名称的命名空间或类不存在
- 【前端】js代码模拟用户键盘鼠标输入
- 前期观看郝斌老师Java学习视频整理的部分笔记
- 数据库基础知识,超全!!!
- Python利用xpath和正则re爬取新浪新闻
- 网易互娱2017实习生招聘在线笔试第一场-1电子数字
- python爬财务数据_会计终于不用被老板催着做报表,现在95%的财务都在悄悄办这事了!...
热门文章
- 曝光和点击都挺高,亚马逊Listing转化率却很低!问题出在哪?
- input仅输入数字且不会偷偷带小尾巴(input里没有,等取值时发现多了一个最后点击的英文字母☺️)
- java 递归和迭代的区别
- 慢学英文版UNIX/Linux系统管理员手册14
- Python入门程序【三】
- 戴尔Alienware x14R1 原厂win11系统 带F12 Support Assist OS Recovery一键还原恢复出厂设置功能
- OpenCV系列之SURF简介(加速的强大功能)| 四十
- 关于 Linux中systemd的一些笔记
- 【一起学Rust】Rust包管理工具Cargo初步了解
- Android 常用adb指令记录总结