在 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架构:
- 每一个 URI 代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过四个 HTTP 动词,对服务器端资源进行操作,实现"表现层状态转化"。
1.2 RESTful 设计误区
- 在 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
- 在 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 架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
- RESTful架构完全基于HTTP协议,充分利用HTTP协议的特点,通过统一接口,使用GET、POST、PUT、DELETE等HTTP动词来区分获取、新增、更新和删除等不同操作。
- 面向资源,一目了然,具有自解释性。在RESTful架构中一切都是资源,用户通过URL访问网站就是请求网站服务器上的资源。每一个URI标示了一个唯一的资源。
- 数据描述简单,一般以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 调用: