在 Spring Boot 构建 RESTful 风格应用

RESTful 架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

1.什么是 RESTful 架构

1.1 REST名词解释

REST -- Representational State Transfer
首先,之所以晦涩是因为前面主语被去掉了,全称是 Resource Representational State Transfer:

  • Resource:资源,即数据。每种资源对应一个特定的URI。
  • Representational:资源的表现形式,比如用JSON,XML,JPEG等。
  • State Transfer:状态变化。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。通过HTTP动词实现(GET、POST、PUT、DELETE)。

综合上面的解释,我们总结一下什么是RESTful架构:

  1. 每一个 URI 代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过四个 HTTP 动词,对服务器端资源进行操作,实现"表现层状态转化"。

1.2 RESTful 设计误区

  1. 在 URI 包含动词
    因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。例如:
POST api/user/get/{id}  //错误 URI,其中get是动词,这个URI就设计错了
 GET api/user/{id}  //正确 URI
 POST api/deleteUser/{id}  //错误 URI,其中delete是动词,这个URI就设计错了
 DELETE api/user/{id}  //正确 URI
 POST api/user/get/{id}  //错误 URI,其中get是动词,这个URI就设计错了
 GET api/user/{id}  //正确 URI
 POST api/deleteUser/{id}  //错误 URI,其中delete是动词,这个URI就设计错了
 DELETE api/user/{id}  //正确 URI

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元:

POST /accounts/1/transfer/500/to/2  //错误 URI
 /**正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是 一种服务:**/
 POST /transaction HTTP/1.1
  Host: 127.0.0.1
  from=1&to=2&amount=500.00
 POST /accounts/1/transfer/500/to/2  //错误 URI
 /**正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是 一种服务:**/
 POST /transaction HTTP/1.1
  Host: 127.0.0.1
  from=1&to=2&amount=500.00
  1. 在 URI 中加入版本号
    因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分。例如:
http://www.example.com/app/1.0/foo  //错误 URI
 http://www.example.com/app/1.1/foo  //错误 URI

 Accept: vnd.example-com.foo+json; version=1.0  //正确
 Accept: vnd.example-com.foo+json; version=1.1  //正确
 http://www.example.com/app/1.0/foo  //错误 URI
 http://www.example.com/app/1.1/foo  //错误 URI

 Accept: vnd.example-com.foo+json; version=1.0  //正确
 Accept: vnd.example-com.foo+json; version=1.1  //正确

2.为什么使用 RESTful 架构

RESTful 架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

  1. RESTful架构完全基于HTTP协议,充分利用HTTP协议的特点,通过统一接口,使用GET、POST、PUT、DELETE等HTTP动词来区分获取、新增、更新和删除等不同操作。
  2. 面向资源,一目了然,具有自解释性。在RESTful架构中一切都是资源,用户通过URL访问网站就是请求网站服务器上的资源。每一个URI标示了一个唯一的资源。
  3. 数据描述简单,一般以XML,JSON做数据交换(现在主要使用JSON)。

3.如何使用 RESTful 架构

使用 RESTful 实现增删改查接口:

@RestController
@RequestMapping("/api/user")
public class UserController {

    // 增加操作  POST api/user/
    @RequestMapping(value = "/" , method = RequestMethod.POST)
    public Result add(@RequestBody User user){
        //...具体接口实现
    }

    // 删除操作  DELETE api/user/{id}
    @RequestMapping(value = "/{id}" , method = RequestMethod.DELETE)
    public Result delete(@PathVariable String id){
        //...具体接口实现
    }

    // 更新操作  PUT api/user/{id}
    @RequestMapping(value = "/{id}" , method = RequestMethod.PUT)
    public Result update(@PathVariable String id , @RequestBody User user){
        //...具体接口实现
    }

    // 查询操作  GET api/user/{id}
    @RequestMapping(value = "/{id}" , method = RequestMethod.GET)
    public Result query(@PathVariable String id){
        //...具体接口实现
    }

    // 查询列表操作  GET api/user/list
    @RequestMapping(value = "/list" , method = RequestMethod.GET)
    public Result list(){
        //...具体接口实现
    }
}
@RestController
@RequestMapping("/api/user")
public class UserController {

    // 增加操作  POST api/user/
    @RequestMapping(value = "/" , method = RequestMethod.POST)
    public Result add(@RequestBody User user){
        //...具体接口实现
    }

    // 删除操作  DELETE api/user/{id}
    @RequestMapping(value = "/{id}" , method = RequestMethod.DELETE)
    public Result delete(@PathVariable String id){
        //...具体接口实现
    }

    // 更新操作  PUT api/user/{id}
    @RequestMapping(value = "/{id}" , method = RequestMethod.PUT)
    public Result update(@PathVariable String id , @RequestBody User user){
        //...具体接口实现
    }

    // 查询操作  GET api/user/{id}
    @RequestMapping(value = "/{id}" , method = RequestMethod.GET)
    public Result query(@PathVariable String id){
        //...具体接口实现
    }

    // 查询列表操作  GET api/user/list
    @RequestMapping(value = "/list" , method = RequestMethod.GET)
    public Result list(){
        //...具体接口实现
    }
}

使用 Postman 调用:

springmvc rustful风格 post用法_json


springmvc rustful风格 post用法_接口实现_02


springmvc rustful风格 post用法_postman_03


springmvc rustful风格 post用法_接口实现_04