当前位置: 首页 > news >正文

RestFul风格详解

概念

RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

功能

  • 资源:互联网所有的事物都可以抽象为资源

  • 资源操作:使用POST,DELETE,PUT,GET,使用不同方法对资源进行操作

  • 分别对应,添加,删除,修改,查询

传统方式操作资源:通过不同的参数来实现不同的效果!方法单一,post,get

  • http://127.0.0.1/item/queryItem.action?id=1 查询,GET

  • http://127.0.0.1/item/savetem.action 新增,POST

  • http://127.0.0.1/item/updateItem.action更新,POST

  • http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

使用RestFul操作资源:可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

  • http://127.0.0.1/item/1 查询,GET

  • http://127.0.0.1/item 新增,POST

  • http://127.0.0.1/item 更新,PUT

  • http://127.0.0.1/item/1 删除,DELETE

测试

  1. 新建一个Controller类 RestFulController

  2. 在springMVC中可以使用@PathVariable 注解,让方法参数的值对应绑定到一个URL模板变量上

 @Controller
 public class RestFulController {
     //http://localhost:8023/springmvc_04_controller_Web_exploded/add?a=1&b=2 原来的写法
     // http://localhost:8023/springmvc_04_controller_Web_exploded/add/1/2 RestFul风格
     @RequestMapping("/add/{a}/{b}")
    public String test(@PathVariable int a, @PathVariable int b, Model model){
         int result = a+b;
         model.addAttribute("msg","结果为"+result);
        return "test";
    }
 }

3.运行效果

使用路径变量的好处:

  • 是路径变的更加简洁高效且安全不会暴露参数

  • 获得参数更加方便,框架会自动进行类型转换

  • 通过路径变量的类型可以约束访问参数,如果请求类型不一样,则访问不到对应的请求方法,会报错400,请求错误

这样是比之前的写法简便许多,但好像还是无法理解同样的URL却是不同的作用,让我们继续测试,我们先看下RequestMapping的源码

 
@Target({ElementType.TYPE, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Mapping
 public @interface RequestMapping {
     String name() default "";
 ​
     @AliasFor("path")
     String[] value() default {};
 ​
     @AliasFor("value")
     String[] path() default {};
 ​
     RequestMethod[] method() default {};
 ​
     String[] params() default {};
 ​
     String[] headers() default {};
 ​
     String[] consumes() default {};
 ​
     String[] produces() default {};
 }

发现其中还有个方法method,返回RequestMethod类型,而RequestMethod是一个枚举,其中就是不同的请求方式

 public enum RequestMethod {
     GET,
     HEAD,
     POST,
     PUT,
     PATCH,
     DELETE,
     OPTIONS,
     TRACE;

这说明我们可以使用method属性来指定请求类型

用于约束请求的类型,可以收窄请求范围,指定请求谓词的类型如: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;

让我们通过测试感受一下

 
public class RestFulController {
     //http://localhost:8023/springmvc_04_controller_Web_exploded/add?a=1&b=2 原来的写法
     // http://localhost:8023/springmvc_04_controller_Web_exploded/add/1/2 RestFul风格
     @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
    public String test(@PathVariable int a, @PathVariable int b, Model model){
         int result = a+b;
         model.addAttribute("msg","结果1为"+result);
        return "test";
    }
     @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.POST)
     public String test1(@PathVariable int a, @PathVariable int b, Model model){
         int result = a+b;
         model.addAttribute("msg","结果2为"+result);
         return "test";
     }
 }

直接运行结果:

我们在写一个表单用post方法请求

a.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Title</title>
 </head>
 <body>
 <form action="add/1/12" method="post">
     <button type="submit" > 提交</button>
 </form>
 </body>
 </html>

测试:进入a.jsp提交表单

两次对比,我们发现两次测试的URL一致,但方法却不相同!!!

小结:SpringMVC的@RequestMapping注解能够处理HTTP请求的方法,如GET,POST,PUT,DELETE以及PATCH

所有的地址栏请求默认都会是HTTP GET类型的

简便方法:Spring中还有组合注解,比如 @GetMapping("/add/{a}/{b}")代替@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)

        @GetMapping("/add/{a}/{b}") == @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)**
     @PostMapping
     @PutMapping
     @DeleteMapping
     @PatchMapping

注:一般@GetMapping使用较多

http://www.dtcms.com/a/111533.html

相关文章:

  • 数据结构每日一题day8(顺序表)★★★★★
  • 大型语言模型的智能本质是什么
  • leetcode数组-二分查找
  • LeetCode题一:求两数之和
  • 密码学基础——DES算法
  • WPF 免费UI 控件HandyControl
  • 大模型-爬虫prompt
  • 字符串拼接
  • Python语料数据清洗方法之一
  • 从代码学习深度学习 - LSTM PyTorch版
  • 【硬件模块】数码管模块
  • 理解OSPF Stub区域和各类LSA特点
  • QEMU学习之路(5)— 从0到1构建Linux系统镜像
  • 【学习篇】fastapi接口定义学习
  • 19.TCP相关实验
  • 哈密尔顿路径(Hamiltonian Path)及相关算法题目
  • 前端快速入门学习3——CSS介绍与选择器
  • 第三季:挪威
  • 阿里Qwen 创建智能体,并实现ubantu系统中调用
  • 对用户登录设计测试用例
  • Transformer由入门到精通(一):基础知识
  • CSS快速上手
  • BUUCTF-web刷题篇(10)
  • 封装自己的api签名sdk
  • 数据结构 -- 图的存储
  • SpringBoot定时任务深度优化指南
  • ubuntu部署ollama+deepseek+open-webui
  • OpenCV 实现对形似宝马标的黄黑四象限标定位
  • 字符串移位包含问题
  • CExercise_1_4continue关键字在while循环和for循环中,实现的功能有什么区别?