美文网首页程序员
RESTFUL风格架构

RESTFUL风格架构

作者: 桃子是水果 | 来源:发表于2019-10-13 21:39 被阅读0次

    前言:

      本文基于java平台,数据交换默认采用JSON。本文需要一定的前后端交互的知识储备以及对spring相关框架的了解才能顺利阅读。
      本文会根据实际开发经验以及技术的迭代更新同步保持更新。
      本文相关定义有借鉴或者引用相关书籍的部分,如有侵权,本文会删除侵权部分。


    什么是REST?

      「REST」是一种「风格」而不是一种规则。其全称是Representational State Transfer(状态转换)。在实际应用中,并不一定要使用这种风格(相对而言,各种微服务api大都采用这种风格),它的优点在于可以使得软件设计更加简洁,更有层次,简言之,它能够将http行为和资源进行分离,对版本的管理也更加友好。其缺点也是显而易见的,REST风格对后端开发者的要求较高,对同样一个业务,普通api一次请求可能就能完成,但是REST风格架构可能需要多次请求。


    REST的特点

    • 资源:REST的主要关注点在「资源(文本、音视频、图片等)」,按照面向对象的思想来说,资源就是存在于互联网上的一个对象。这个对象可以通过一个URI进行精确定位。
    • 表现层:资源可以通过各种形式进行展现,这取决于用户需求(开发者始终都是为甲方所服务的)。在大多数情况下,我们的资源都是以JSON格式展现的。
    • 状态转换:和现实中的资源一样,网络资源也是一个变化的过程,这个过程在http请求中分别对应创建(POST请求)、访问(GET请求)、修改(PUT请求)、部分修改(PATCH请求)和删除(DELETE请求)的过程。由于HTTP协议是无状态的,所以状态转换即资源的状态转换。

    RESTFUL风格的设计

    RESTFUL风格设计说简单也简单,说难也难,新手初学时,需要记得在规则中URI中不允许出现动词。因为请求方式已经包含了动作的信息。

    很多新兴网站的URI都能看到RESTFUL风格的影子。
    注意:本小节所有的正确错误都是以RESTFUL风格的规则为基准。

    // 不规则的URI设计:出现了动词
    // 获取用户信息,GET请求 
    ip/users/getUser/{userId}  
    
    // 不推荐的设计
    // 下面的URI冗长并且不直观
    ip/users?userId=1&userName=test&sex=1&age=23&phone=123
    

    以下是规则的设计:

    // 获取用户信息,GET请求
    ip/users/{userId}
    
    // 获取用户列表 ,GET请求
    ip/users/
    
    // 更新部分用户信息, PATCH请求(与PUT请求的功能部分重叠)
    ip/users/{userId}/{userName}
    
    // 更新用户全部信息,PUT请求
    ip/users/{userId}/{userName}/{sex}/{age}/{phone}/
    

    URI中的参数在后台代码中通过@PathVariable注解获取。如果URI包含版本信息,应该将版本信息放在请求头中。

    • 后台小例子
    /**
    * 创建用户.
    **/
    @PostMapping("/user")
    @ResponseBody
    public Map<String, Object> createUser(@RequestBody User user) {
    // do something
    }
    

    后台接收参数的方式有很多,@RequestBody注解只是其中一种比较方便的写法,正常情况下,只要前端参数名和后台参数实体对象的属性名相同,spring就会自动进行映射。


    开发经验

    • 一般建议参数数量在五个以内才采用@PathVariable注解来接收。超过五个的应采用JSON格式传递参数。
    • RESTFUL风格在前后端分离的系统中比较流行。
    • 前端在发出请求时可以指定相应的请求类型(本文只举例ajax请求)
    // POST、GET请求
    $.ajax({
                url : "你的url地址",
                // type : "get",            
                type : "post",  
                dataType : "json",
                cache : false,
                data:{
                    key1: value1,
                    key2: value2,
                    keyN: valueN
                },
                success: (data) => {
                    // do something
                }
    
    // PUT、PATCH、DELETE请求,此处只举例DELETE请求,其他大同小异
    $.ajax({
                url : "你的url地址",            
                type : "delete",  
                dataType : "json",
                cache : false,
                data:{
                    key1: value1,
                    key2: value2,
                    keyN: valueN,
                    _method : "delete"
                },
                success: (data) => {
                    // do something
                }
    
    • 在Class上使用@RestController,在方法上使用@PostMapping @GetMapping @PutMapping @PatchMapping @DeleteMapping注解,再辅助以规范的REST风格的URI设计,可以快速地上手RESTFUL风格架构。

    @RestController 注解会将本类的所有方法的返回值转化为JSON格式的数据。

    • 在前后端没有约定好参数名的情况下,甚至遇到某些奇葩的前端开发者,可以使用@RequestBody Map<K,V>来接收参数,以不变应万变。

    相关文章

      网友评论

        本文标题:RESTFUL风格架构

        本文链接:https://www.haomeiwen.com/subject/mjykmctx.html