使用RESTful风格开发Java Web

什么是RESTful风格?
REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,而 HTTP 是一种包含了 REST 架构属性的协议,为了便于理解,我们把它的首字母拆分成不同的几个部分:
- 表述性(REpresentational): REST 资源实际上可以用各种形式来进行表述,包括 XML、JSON 甚至 HTML——最适合资源使用者的任意形式;
- 状态(State): 当使用 REST 的时候,我们更关注资源的状态而不是对资源采取的行为;
- 转义(Transfer): REST 涉及到转移资源数据,它以某种表述性形式从一个应用转移到另一个应用。
简单地说,REST 就是将资源的状态以适合客户端或服务端的形式从服务端转移到客户端(或者反过来)。在 REST 中,资源通过 URL 进行识别和定位,然后通过行为(即 HTTP 方法)来定义 REST 来完成怎样的功能。
实例说明:
在平时的 Web 开发中,method 常用的值是 GET 和 POST,但是实际上,HTTP 方法还有 PATCH、DELETE、PUT 等其他值,这些方法又通常会匹配为如下的 CRUD 动作:
CRUD 动作 | HTTP 方法 |
---|---|
Create | POST |
Read | GET |
Update | PUT 或 PATCH |
Delete | DELETE |
尽管通常来讲,HTTP 方法会映射为 CRUD 动作,但这并不是严格的限制,有时候 PUT 也可以用来创建新的资源,POST 也可以用来更新资源。实际上,POST 请求非幂等的特性(即同一个 URL 可以得到不同的结果)使其成一个非常灵活地方法,对于无法适应其他 HTTP 方法语义的操作,它都能够胜任。
在使用 RESTful 风格之前,我们如果想要增加一条商品数据通常是这样的:
但是使用了 RESTful 风格之后就会变成:
这就变成了使用同一个 URL ,通过约定不同的 HTTP 方法来实施不同的业务,这就是 RESTful 风格所做的事情了,为了有一个更加直观的理解,引用一下来自how2j.cn的图:

SpringBoot 中使用 RESTful
下面我使用 SpringBoot 结合文章:http://blog.didispace.com/springbootrestfulapi/ 来实例演示如何在 SpringBoot 中使用 RESTful 风格的编程并如何做单元测试
RESTful API 具体设计如下:

User实体定义:
实现对User对象的操作接口
编写测试单元
参考文章:http://tengj.top/2017/12/28/springboot12/#Controller单元测试
看过这几篇文章之后觉得好棒,还有这么方便的测试方法,这些以前都没有接触过...
下面针对该Controller编写测试用例验证正确性,具体如下。当然也可以通过浏览器插件等进行请求提交验证,因为涉及一些包的导入,这里给出全部代码:
MockMvc实现了对HTTP请求的模拟,从示例的代码就能够看出MockMvc的简单用法,它能够直接使用网络的形式,转换到Controller的调用,这样使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
需要注意的就是在MockMvc使用之前需要先用MockMvcBuilders构建MockMvc对象,如果对单元测试感兴趣的童鞋请戳上面的链接哦,这里就不细说了
测试信息
运行测试类,控制台返回的信息如下:
通过控制台信息,我们得知通过 RESTful 风格能成功调用到正确的方法并且能获取到或者返回正确的参数,没有任何错误,则说明成功!
如果你想要看到更多的细节信息,可以在每次调用 perform()
方法后再跟上一句 .andDo(MockMvcResultHandlers.print())
,例如:
就能看到详细的信息,就像下面这样:
总结
我们仍然使用 @RequestMapping 注解,但不同的是,我们指定 method 属性来处理不同的 HTTP 方法,并且通过 @PathVariable 注解来将 HTTP 请求中的属性绑定到我们指定的形参上。
事实上,Spring 4.3 之后,为了更好的支持 RESTful 风格,增加了几个注解:@PutMapping、@GetMapping、@DeleteMapping、@PostMapping,从名字也能大概的看出,其实也就是将 method 属性的值与 @RequestMapping 进行了绑定而已,例如,我们对UserController中的deleteUser方法进行改造:
使用Swagger2构造RESTful API文档
RESTful 风格为后台与前台的交互提供了简洁的接口API,并且有利于减少与其他团队的沟通成本,通常情况下,我们会创建一份RESTful API文档来记录所有的接口细节,但是这样做有以下的几个问题:
- 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下游的抱怨声不绝于耳。
- 随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。
Swagger2的出现就是为了解决上述的这些问题,并且能够轻松的整合到我们的SpringBoot中去,它既可以减少我们创建文档的工作量,同时说明内容又可以整合到代码之中去,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明,这太酷了,另外Swagger2页提供了强大的页面测试功能来调试每个RESTful API,具体效果如下:

让我们赶紧来看看吧:
第一步:添加Swagger2依赖:
在 pom.xml
中加入Swagger2的依赖:
第二步:创建Swagger2配置类
在SpringBoot启动类的同级目录下创建Swagger2的配置类 Swagger2
:
如上面的代码所示,通过 @Configuration
注解让Spring来加载该配置类,再通过 @EnableSwagger2
注解来启动Swagger2;
再通过 createRestApi
函数创建 Docket
的Bean之后,apiInfo()
用来创建该API的基本信息(这些基本信息会展现在文档页面中),select()
函数返回一个 ApiSelectorBuilder
实例用来控制哪些接口暴露给Swagger来展现,本例采用指定扫描的包路径来定义,Swagger会扫描该包下所有的Controller定义的API,并产生文档内容(除了被 @ApiIgnore
指定的请求)
第三步:添加文档内容
在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。如下所示,我们通过@ApiOperation
注解来给API增加说明、通过@ApiImplicitParams
、@ApiImplicitParam
注解来给参数增加说明。
完成上述代码添加之后,启动Spring Boot程序,访问:http://localhost:8080/swagger-ui.html,就能看到前文展示的RESTful API的页面,我们可以点开具体的API请求,POST类型的/users请求为例,可找到上述代码中我们配置的Notes信息以及参数user的描述信息,如下图所示:

API文档访问与调试
在上图请求的页面中,我们可以看到一个Value的输入框,并且在右边的Model Schema中有示例的User对象模板,我们点击右边黄色的区域Value框中就会自动填好示例的模板数据,我们可以稍微修改修改,然后点击下方的 “Try it out!”
按钮,即可完成一次请求调用,这太酷了。

总结
对比之前用文档来记录RESTful API的方式,我们通过增加少量的配置内容,在原有代码的基础上侵入了忍受范围内的代码,就可以达到如此方便、直观的效果,可以说是使用Swagger2来对API文档进行管理,是个很不错的选择!
欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz
欢迎关注公众微信号:wmyskxz_javaweb
分享自己的Java Web学习之路以及各种Java学习资料
__EOF__

本文链接:https://www.cnblogs.com/wmyskxz/p/9104368.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?