使用RESTful风格开发JavaWeb
什么是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
Updatecontroller翻译中文
PUT 或 PATCH
Delete
DELETE
尽管通常来讲,HTTP 方法会映射为 CRUD 动作,但这并不是严格的限制,有时候 PUT 也可以用来创建新的资源,POST 也可以用来更新资源。实际上,POST 请求非幂等的特性(即同一个 URL 可以得到不同的结果)使其成一个非常灵活地方法,对于无法适应其他 HTTP 方法语义的操作,它都能够胜任。
在使用 RESTful 风格之前,我们如果想要增加一条商品数据通常是这样的:
/addCategory?name=xxx
但是使用了 RESTful 风格之后就会变成:
/category
SpringBoot 中使用 RESTful
下面我使用 SpringBoot 结合文章: 来实例演示如何在 SpringBoot 中使用 RESTful 风格的编程并如何做单元测试
RESTful API 具体设计如下:
User实体定义:
public class User {        private Long id;      private String name;      private Integer age;        // 省略setter和getter        }
实现对User对象的操作接口
编写测试单元
参考文章:单元测试 看过这几篇文章之后觉得好棒,还有这么方便的测试方法,这些以前都没有接触过...
下面针对该Controller编写测试用例验证正确性,具体如下。当然也可以通过浏览器插件等进行请求提交验证,因为涉及一些包的导入,这里给出全部代码:
MockMvc实现了对HTTP请求的模拟,从示例的代码就能够看出MockMvc的简单用法,它能够直接使用网络的形式,转换到Controller的调用,这样使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
需要注意的就是在MockMvc使用之前需要先用MockMvcBuilders构建MockMvc对象,如果对单元测试感兴趣的童鞋请戳上面的链接哦,这里就不细说了
测试信息
运行测试类,控制台返回的信息如下:
通过控制台信息,我们得知通过 RESTful 风格能成功调用到正确的方法并且能获取到或者返回正确的参数,没有任何错误,则说明成功!
如果你想要看到更多的细节信息,可以在每次调用 perform( 方法后再跟上一句 .andDo(MockMvcResultHandlers.print() ,例如:
        // 1、get查一下user列表,应该为空        request = get("/users/");        mvc.perform(request)                .andExpect(status(.isOk()                .andExpect(content(.string(equalTo("[]")))                .andDo(MockMvcResultHandlers.print();
就能看到详细的信息,就像下面这样:
MockHttpServletRequest:      HTTP Method = GET      Request URI = /users/        Parameters = {}          Headers = {}              Body = <no character encoding set>    Session Attrs = {}  Handler:              Type = cn.ller.UserController            Method = public java.util.List<cn.wmyskxz.springboot.pojo.User> cn.wmyskxz.springboot.c
UserList(  Async:    Async started = false      Async result = null  Resolved Exception:              Type = null  ModelAndView:        View name = null              View = null            Model = null  FlashMap:        Attributes = null  MockHttpServletResponse:            Status = 200    Error message = null          Headers = {Content-Type=[application/json;charset=UTF-8]}      Content type = application/json;charset=UTF-8              Body = []    Forwarded URL = null    Redirected URL = null          Cookies = []
总结
使用Swagger2构造RESTful API文档
参考文章:
RESTful 风格为后台与前台的交互提供了简洁的接口API,并且有利于减少与其他团队的沟通成本,通常情况下,我们会创建一份RESTful API文档来记录所有的接口细节,但是这样做有以下的几个问题:
1.由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下游的抱怨声不绝于耳。
2.随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。
Swagger2的出现就是为了解决上述的这些问题,并且能够轻松的整合到我们的SpringBoot中去,它既可以减少我们创建文档的工作量,同时说明内容又可以整合到代码之中去,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明,这太酷了,另外Swagger2页提供了强大的页面测试功能来调试每个RESTful API,具体效果如下:
让我们赶紧来看看吧:
第一步:添加Swagger2依赖:
在 l 中加入Swagger2的依赖:
<dependency>    <groupId>io.springfox</groupId>    <artifactId>springfox-swagger2</artifactId>    <version>2.2.2</version> </dependency> <dependency>    <groupId>io.springfox</groupId>    <artifactId>springfox-swagger-ui</artifactId>    <version>2.2.2</version> </dependency>
第二步:创建Swagger2配置类
在SpringBoot启动类的同级目录下创建Swagger2的配置类 Swagger2:
第三步:添加文档内容
完成上述代码添加之后,启动Spring Boot程序,访问:,就能看到前文展示的RESTful API的页面,我们可以点开具体的API请求,POST类型的/users请求为例,可到上述代码中我们配置的Notes信息以及参数user的描述信息,如下图所示:
API文档访问与调试
在上图请求的页面中,我们可以看到一个Value的输入框,并且在右边的Model Schema中有
示例的User对象模板,我们点击右边黄的区域Value框中就会自动填好示例的模板数据,我们可以稍微修改修改,然后点击下方的 “Try it out!” 按钮,即可完成一次请求调用,这太酷了。
总结
对比之前用文档来记录RESTful API的方式,我们通过增加少量的配置内容,在原有代码的基础上侵入了忍受范围内的代码,就可以达到如此方便、直观的效果,可以说是使用Swagger2来对API文档进行管理,是个很不错的选择!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。