1. RESTful
1.1 什么是REST
REST(表述性状态转移,Representational State Transfer):指的是一组架构约束条件和原则,描述了一个架构样式的网络系统。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
这是一种设计思想、设计风格,而不是一种标准。
-
Resources(资源):网络上的一个实体,或者说是网络上的一个具体信息。
-
Representation(表现层):把"资源"具体呈现出来的形式,叫做它的"表现层"。
-
State Transfer(状态转换):客户端发出请求,服务器端发生"状态转化"。
1.2 什么是RESTful
满足REST约束条件和原则的应用程序或设计就是RESTful。RESTful 架构可以充分的利用 HTTP 协议的各种功能,是 HTTP 协议的最佳实践。REST利用了HTTP自身的特性,如HTTP动词、HTTP状态码、HTTP报头等。
HTTP动词:
- POST:新增资源
- DELETE:删除资源
- GET:获取资源
- PUT:更新资源
HTTP状态码:
- 1XX:相关信息
- 2XX:操作成功
- 3XX:重定向
- 4XX:客户端错误
- 5XX:服务器错误
HTTP报头:
- Authorization:认证报头
- Cache-Control:缓存报头
- Cnotent-Type:消息体类型报头
RESTful架构特点:
- 每一个URI代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端使用GET、POST、PUT、DELETE4个表示操作方式(CRUD)的动词对服务端资源进行操作,实现"表现层状态转化"。
1.3 统一资源接口
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作.
如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。
- GET:安全且幂等
- POST:不安全不幂等
- PUT:不安全、幂等
- DELETE:不安全、幂等
1.4 RESTful应用
REST 风格提倡 URL
地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。
传统方式 | 请求方式 | RESTful | 请求方式 |
---|---|---|---|
http://127.0.0.1/item/queryItem.action?id=1 | GET | http://127.0.0.1/item/1 | GET |
http://127.0.0.1/item/saveItem.action | POST | http://127.0.0.1/item | POST |
http://127.0.0.1/item/updateItem.action | POST | http://127.0.0.1/item | PUT |
http://127.0.0.1/item/deleteItem.action?id=1 | GET或POST | http://127.0.0.1/item/1 | DELETE |
2. SpringMVC 数据绑定
在Spring MVC中常用的数据绑定的的注解有@PathVariable
、@RequestBody
、@RequestParam
2.1 @PathVariable
2.1.1 @PathVariable
@PathVariable:路径变量,是Spring的注解,指示方法参数应绑定到URL模板变量,作用是在请求URL路径上进行数据绑定。
-
在URL中通过占位符
{...}
与@PathVariable
后的参数进行绑定。 -
@PathVariable支持GET请求。
-
@PathVariable只能标识参数。
2.1.2 @PathVariable源码
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
@AliasFor("name")
String value() default "";
// 要绑定到的路径变量的名称。
@AliasFor("value")
String name() default "";
// 是否需要path变量。
boolean required() default true;
}
2.1.3 @PathVariable应用
🔶 示例:
@Controller
public class A_PathVariable {
@RequestMapping("/A_P/{a}/{b}")
public String Test(@PathVariable int a, @PathVariable int b, Model model){
model.addAttribute("Result",a + b);
return "test";
}
}
🔴 结果如下:
2.2 @RequestBody
2.2.1 @RequestBody
@PathVariable:请求体,请求体的数据绑定,作用是接收前端传递给后端的json字符串中的数据。
@RequestBody与@RequestParam()可以同时使用,
一个请求中:
@RequestBody只有一个
@RequestParam()可以有多个
2.2.2 @RequestBody源码
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
// 是否需要正文内容。
boolean required() default true;
}
2.3 @RequestParam
2.3.1 @RequestParam
@RequestParam:请求参数,用于将请求参数区域的数据映射到控制层方法的参数上。
2.3.2 @RequestParam源码
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
// 要绑定到的请求参数的名称
@AliasFor("value")
String name() default "";
// 是否需要该参数
boolean required() default true;
// 在未提供请求参数或请求参数为空值时用作回退的默认值
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
2.3.3 @RequestParam应用
🔶 示例:
@Controller
public class A_RequestParam {
@RequestMapping("/A_R_Param")
public String Test(@RequestParam String name, Model model){
model.addAttribute("Result", name);
return "test";
}
}
🔴 结果如下:
2.3.4 @RequestParam别名
可以通过在@RequestParam()定义别名的方式,来实现对别名赋值。定义别名后,原来的属性名就不能再使用了!
🔶 示例:
@Controller
public class A_RequestParam {
@RequestMapping("/A_R_Param")
public String Test(@RequestParam("username") String name, Model model){
model.addAttribute("Result", name);
return "test";
}
}
🔴 结果如下:
2.4 小结
请求位置:
- 注解@RequestParam接收的参数是来自requestHeader中,即请求头。
- 注解@RequestBody接收的参数是来自requestBody中,即请求体。
请求方式:
- @RequestParam:通常用于GET请求,也支持POST、DELETE。
- @RequestBody:通常用于POST、DELETE,GET也适用。
3. CRUD
@RequestMapping注解可以通过设置method属性,来将同一个URL映射到不同的HandlerMrthod方法上,从而完成CRUD的操作。
/**
* 要映射到的HTTP请求方法
* GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE.
*/
RequestMethod[] method() default {};
但在实际应用中,可以简写为:@[method]Mapping
其注解类型包含:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
@GetMapping等价于@RequestMapping(method =RequestMethod.GET)
🔶 @GetMapping:
@GetMapping("/GET_M/{a}/{b}")
public String Get(@PathVariable int a,@PathVariable int b, Model model) {
model.addAttribute("Result", a);
return "test";
}
4. 写在最后
SpringMVC可以利用RESTful来处理提交的数据,能简化代码量、提高安全性,并且通过简单的注解就能完成需要的功能实现。