程序员

RESTFUL风格架构

2019-10-13  本文已影响0人  桃子是水果

前言:

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


什么是REST?

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


REST的特点


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就会自动进行映射。


开发经验

// 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
            }

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


上一篇下一篇

猜你喜欢

热点阅读