SpringMVC-RESTful

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架构特点:

  1. 每一个URI代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端使用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=1GEThttp://127.0.0.1/item/1GET
http://127.0.0.1/item/saveItem.actionPOSThttp://127.0.0.1/itemPOST
http://127.0.0.1/item/updateItem.actionPOSThttp://127.0.0.1/itemPUT
http://127.0.0.1/item/deleteItem.action?id=1GET或POSThttp://127.0.0.1/item/1DELETE

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";
    }
}

🔴 结果如下:

image-20211014092605686

image-20211014093005763

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";
    }
}

🔴 结果如下:

image-20211014101950990

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";
    }
}

🔴 结果如下:

image-20211014102628512

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";
}

image-20211014110013554

4. 写在最后

SpringMVC可以利用RESTful来处理提交的数据,能简化代码量、提高安全性,并且通过简单的注解就能完成需要的功能实现。

 


❤️ END ❤️
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值