网站首页 > 技术文章 正文
Spring Boot支持Rest风格:使用HTTP请求方式的动词来表示对资源的操作
非Rest风格
以前这样写接口:
/getUser 获取用户
/deleteUser 删除用户
/updateUser 修改用户
/saveUser 保存用户
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
public String getUser() {
return "GET";
}
@RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
public String deleteUser() {
return "POST";
}
@RequestMapping(value = "/updateUser", method = RequestMethod.POST)
public String updateUser() {
return "POST";
}
@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
public String saveUser() {
return "POST";
}
使用Rest风格
使用Rest风格,则这样写接口:
/user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
@GetMapping("/user")
public String getUser() {
return "GET";
}
@PostMapping("/user")
public String saveUser() {
return "POST";
}
@PutMapping("/user")
public String putUser() {
return "PUT";
}
@DeleteMapping("/user")
public String deleteUser() {
return "DELETE";
}
表单提交
通过表单方式提交请求,请求类型只能支持Get与Post
若表单提交要使用REST风格,则表单请求方式使用Post,添加隐藏域 _method=put、 _method=delete方式来支持Rest风格
示例如下
<form action="/user" method="post">
<input name="_method" type="hidden" value="delete"/>
<input value="REST提交" type="submit"/>
</form>
SpringBoot配置文件中开启页面表单的Rest功能
spring:
mvc:
hiddenmethod:
filter:
enabled: true
过程分析
首先是从自动配置类WebMvcAutoConfiguration开始,其中的hiddenHttpMethodFilter方法入手,请求首先被该方法拦截
接着创建OrderedHiddenHttpMethodFilter对象,其又继承HiddenHttpMethodFilter
HiddenHttpMethodFilter中的doFilterInternal核心方法进行了相关拦截操作,要求是Post请求并且请求正常,然后获取请求参数_method
request.getParameter(this.methodParam)从请求中获取_method参数进行判断拦截,故可修改默认_method,自定义隐藏参数。
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
methodFilter.setMethodParam("_mymethod");
return methodFilter;
}
请求映射过程分析
首先一个请求肯定会经过HttpServlet类的doGet()或doPost()等方法,当然不一定会执行,但其子类肯定会有对其的具体实现,其实现类如下:
推测+大概看源码得出Spring Boot的一个请求会经过FrameworkServlet类的doGet()方法
processRequest方法又调用了doService方法
doService方法是一个接口,FrameworkServlet并没有具体实现
不过DispatcherServlet对其经行了具体实现,doService方法中又调用doDispatch核心请求分发方法
doDispatch方法中又寻找当前请求使用哪个Handler(处理器映射器)
Spring Boot默认已配置有如下5种处理器映射器。这里会挨个尝试所有的HandlerMapping看是否有匹配的请求
在Spring Boot启动时,相关处理器映射器已经将请求关系进行了绑定,保存了所有@RequestMapping 和handler的映射规则
如下:某Controller层的/index请求方法就与RequestMappingHandlerMapping进行了关联绑定
接着再执行mapping.getHandler(request)
执行this.getHandlerInternal(request),来到AbstractHandlerMethodMapping类重写的方法
执行 super.getHandlerInternal(request);得到当前请求Path
执行this.lookupHandlerMethod(lookupPath, request);进行判断当前请求的是具体那个方法,即请求对应的handler,找到后并返回。
到此,Spring Boot的请求映射过程解析完毕。最终,请求映射过程中涉及的类如下:
原文出处:https://juejin.cn/post/7112070118732988430
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
学习更多JAVA知识与技巧,关注与私信博主(555)
猜你喜欢
- 2024-10-13 谈谈springboot 获取前端json数据几种方法
- 2024-10-13 在Spring Boot中如何获取到Request对象?
- 2024-10-13 SpringBoot:如何优雅地进行响应数据封装、异常处理
- 2024-10-13 SpringBoot实现接口防抖的几种方案,杜绝重复提交
- 2024-10-13 @PostMapping @GetMapping注解 postmapping注解接收参数
- 2024-10-13 如何在SpringBoot中动态过滤JSON响应正文
- 2024-10-13 WebSocket 集群解决方案 websocket500
- 2024-10-13 SpringBoot跨系统调用接口方案 springboot跨越设置
- 2024-10-13 SpringBoot如何优雅的进行参数校验(一)
- 2024-10-13 IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)