SpringBoot 学习笔记心得请求参数处理

Posted Adorable_Rocy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 学习笔记心得请求参数处理相关的知识,希望对你有一定的参考价值。

1.请求映射

        1).rest使用原理

  • 格式:xxxMapping (Get Post Delete Put )
  • Rest风格支持(使用HTTP请求方式动词来表示对资源的操作)
  • 以前的CRUD操作命名:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
  • 现在CRUD使用rest风格:user GET/获取用户 DELETE/删除用户 PUT/修改用户 POST/保存用户
  • 核心Filter:HiddenHttpMethodFilter; 这个在配置项中默认是关闭的,需要我们手动去开启; 可以支持隐藏_method方式解析。
    示例:
 	 @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-请求";
    }

使用PostMan测试

1.GET请求
在这里插入图片描述
2.POST请求

在这里插入图片描述

3.PUT请求
在这里插入图片描述
4.DELETE请求
在这里插入图片描述
补充:模拟表单请求Put/Delete方式请求的时候,不会生效,我们需要配置 spring.mvc.hiddenmethod.filter.enabled属性

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

补充2:修改_method为我们自己喜欢的_后缀

前言:注意HiddenHttpMethodFilter有两个,使用filter包下的即可
在这里插入图片描述

1.查看WebMvcAutoConfiguration自动配置类,在容器中不包含HiddenHttpMethodFilter类时,则会默认生效此类配置。

 @Bean
    @ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
    @ConditionalOnProperty(
        prefix = "spring.mvc.hiddenmethod.filter",
        name = {"enabled"},
        matchIfMissing = false
    )
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new OrderedHiddenHttpMethodFilter();
    }

2.查看父类默认规则,默认规则就是_method方式,但是此类提供了设置Method的Set方法

public class HiddenHttpMethodFilter extends OncePerRequestFilter {
    private static final List<String> ALLOWED_METHODS;
    public static final String DEFAULT_METHOD_PARAM = "_method";
    private String methodParam = "_method";

    public HiddenHttpMethodFilter() {
    }

    public void setMethodParam(String methodParam) {
        Assert.hasText(methodParam, "'methodParam' must not be empty");
        this.methodParam = methodParam;
    }

3.自定义Filter (HiddenHttpMethodFilter )

@Configuration(proxyBeanMethods = false)
public class WebMvcConfig {
        @Bean
        public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
            HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
            hiddenHttpMethodFilter.setMethodParam("_m");
            return hiddenHttpMethodFilter;
        }
}

4.form表格提交请求

<form action="/user" method="post">
    <input name="_m" type="hidden" value="delete"/>
    <input type="submit" value="delete提交"/>
</form>

<form action="/user" method="post">
    <input name="_m" type="hidden" value="put"/>
    <input type="submit" value="put提交"/>
</form>

5.测试

1.delete请求
在这里插入图片描述
2.put请求
在这里插入图片描述

出现重名错误,问题解决【传送门】

2.普通参数与基本注解

  1. 常用注解:
注解名:@RequestParam@PathVariable@RequestHeader@ModelAttribute@RequestBody@CookieValue@MatrixVariable
使用场景Uri携带参数进行解析rest请求路径(/user/{id})获取请求头转发携带参数表单类数据提交获取获取浏览器中Cookie(也可以使用Cookie对象直接接收,获取所有Cookie)cookie被禁用,需要获取session的值,重写url

示例:

   /**
     *  补充:在使用注解的时候,如果不指定value值,则默认获取所有值
     * @param id
     * @param name
     * @param pv
     * @param userAgent
     * @param header
     * @param age
     * @param inters
     * @param params
     * @param jessionid
     * @return
     */
 @GetMapping("/user/{id}/owner/{username}")
    public Map<String,Object> getUser(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @PathVariable Map<String,String> pv,
                                      @RequestHeader("User-Agent") String userAgent,
                                      @RequestHeader Map<String,String> header,
                                      @RequestParam("age") Integer age,
                                      @RequestParam("inters") List<String> inters,
                                      @RequestParam Map<String,String> params,
                                      @CookieValue("JSESSIONID") String jessionid){
			        Map<String,Object> map = new HashMap<>();
			        map.put("id",id);
			        map.put("name",name);
			        map.put("pv",pv);
			        map.put("userAgent",userAgent);
			        map.put("headers",header);
			        map.put("age",age);
			        map.put("inters",inters);
			        map.put("params",params);
			        map.put("jessionid",jessionid);

        return map;
    }

结果展示:
在这里插入图片描述
2. 矩阵变量

  1. 准备矩阵变量的环境.
<a href="/user/info;age=12;username=lisi,wangwu,zhaoliu">发送查询用户信息 写法一</a>

<a href="/user/info;username=lisi;username=wangwu;username=zhaoliu;age=12">发送查询用户信息 写法二</a>

<a href="/boos/1;user/1;age=20/2;age=3"> 查询boos 年龄为20的 id 为1 下的id为2 年龄为3的员工</a>
  1. 完成Cntroller的编写。
  @GetMapping("/user/{path}")
    public Map userInfo(@MatrixVariable("username") List<String> user ,
                         @MatrixVariable("age") Integer age,
                         @PathVariable("path") String path){
	        Map<String , Object> map = new HashMap<>();
	        map.put("username" , user);
	        map.put("age",age);
	        map.put("path",path);
	        return map;
    }

补充:这里路径必须得使用路径变量的方式,否则会引起404问题

  1. 在访问过程中,一定会遇到400问题。

修改WebMvcAutoconfigur中的UrlPathHelper,这是因为UrlPathHelper中属性值removeSemicolonContent=true,属性的含义是删除分号,导致矩阵语法失效,从而导致400错误

在这里插入图片描述

  1. 将属性值修改即可
    1.实现WebMvcConfigurer接口,重写void configurePathMatch(PathMatchConfigurer configurer)方法
public class WebMvcConfig implements WebMvcConfigurer {
	@Override
     public void configurePathMatch(PathMatchConfigurer configurer) {
          UrlPathHelper urlPathHelper = new UrlPathHelper();
          //设置不删除分号
          urlPathHelper.setRemoveSemicolonContent(false);
          configurer.setUrlPathHelper(urlPathHelper);
      }
}

2.将WebMvcConfigurer添加到容器,自定义规则

	@Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void configurePathMatch(PathMatchConfigurer configurer) {
                UrlPathHelper urlPathHelper = new UrlPathHelper();
                //设置不删除分号
                urlPathHelper.setRemoveSemicolonContent(false);
                configurer.setUrlPathHelper(urlPathHelper);
            }
        };
    }

3.展示结果

在这里插入图片描述

  1. 关于多变量,重名如何解决?

1.使用pathVar 指明路径中的数据

   // 路径: /boos/1;age=20/2;age=3
  @GetMapping("/boos/{boosid}/{empid}")
    public Map getEmp(@MatrixVariable(value = "age",pathVar = "boosid") Integer boosAge ,
                      @MatrixVariable(value = "age",pathVar = "empid") Integer empAge){
        Map<String , Object> map = new HashMap<>();
        map.put("boosAge" ,boosAge);
        map.put("empAge" ,empAge);
        return map;
    }

2.结果展示
在这里插入图片描述

以上是关于SpringBoot 学习笔记心得请求参数处理的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot学习笔记总结

SpringBoot 学习笔记心得拦截器配置使用

SpringBoot 学习笔记心得自定义Starter启动器

SpringBoot 学习笔记心得单文件&多文件上传

关于HttpClient的学习心得,请求参数中文乱码问题

第260天学习打卡(知识点回顾 springboot 请求参数处理)