SpringBoot之Rest请求及原理

2022-08-18 11:56:27

Rest 使用

  • 以前的方式:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
  • 现在的方式: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
    通过 http 请求方式来区分对资源的操作
@RestControllerpublicclassUserController{@GetMapping("/user")public StringgetUser(){return"GET-张三";}@PostMapping("/user")public StringsaveUser(){return"POST-张三";}@PutMapping("/user")public StringputUser(){return"PUT-张三";}@DeleteMapping("/user")public StringdeleteUser(){return"DELETE-张三";}}

Rest请求原理

spring:mvc:hiddenmethod:filter:enabled:true#开启页面表单的Rest功能

1. 表单使用 rest 风格提交

  • form表单提交需要添加_method=PUT
<formaction="/user"method="post"><inputtype="hidden"name="_method"value="PUT"><inputtype="submit"value="GET提交"></form>

通过 springboot 的自动装配原理,可以知道,当引入了 web 开发的 jar 包时,自动启用了WebMvcAutoConfiguration.java 类配置的相关功能,可以看到注入了很多的 bean,其中有一个是过滤请求处理的

@Bean@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})// 不存在HiddenHttpMethodFilter的时候生效@ConditionalOnProperty(
        prefix="spring.mvc.hiddenmethod.filter",
        name={"enabled"},
        matchIfMissing=false)// 如果没有配置此属性,默认不启用public OrderedHiddenHttpMethodFilterhiddenHttpMethodFilter(){returnnewOrderedHiddenHttpMethodFilter();}

继续跟进

publicclassOrderedHiddenHttpMethodFilterextendsHiddenHttpMethodFilterimplementsOrderedFilter{...}publicclassHiddenHttpMethodFilterextendsOncePerRequestFilter{...}publicabstractclassOncePerRequestFilterextendsGenericFilterBean{...}publicabstractclassGenericFilterBeanimplementsFilter, BeanNameAware, EnvironmentAware, EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean{protectedfinal Log logger= LogFactory.getLog(this.getClass());

可以发现,最终是实现了 Filter 过滤器。
①请求过来被HiddenHttpMethodFilter拦截;
②请求是否正常,并且是POST;
③获取到_method的值。
④兼容以下请求;PUT.DELETE.PATCH;
⑤原生request(post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值。
⑥过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的。
我们将断点打到HiddenHttpMethodFilter -> doFilterInternal进行调试跟踪
在这里插入图片描述
上面表单中提到,使用 rest 请求方式,必须条件一个_method=PUT/DELETE参数,通过截图代码可以看出,底层,默认就是获取_method 的值,来进行 request 包装,后面到了 handler ,通过 request.getMethod() 来获取对应的请求方式完成。
在这里插入图片描述

  • 自定义表单提交需要携带的 _method
    通过源码可以发现,注入OrderedHiddenHttpMethodFilter 这个 bean 的时候,上面的条件@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})当不存在的时候生效,这个时候可以通过自定义来修改我们自己喜欢的参数
@ConfigurablepublicclassWebMvcConfig{@Beanpublic HiddenHttpMethodFilter hiddenHttpMethodFilter(){
		HiddenHttpMethodFilter filter=newHiddenHttpMethodFilter();
		filter.setMethodParam("_m");return filter;}}

2. Rest使用客户端工具
利用 http 工具发送 rest 请求,如PostMan直接发送Put、delete等方式请求,无需Filter。

  • 作者:搬运Gong
  • 原文链接:https://blog.csdn.net/qq_20315217/article/details/113588631
    更新时间:2022-08-18 11:56:27