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.普通参数与基本注解
- 常用注解:
注解名: | @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. 矩阵变量
- 准备矩阵变量的环境.
<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>
- 完成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问题
- 在访问过程中,一定会遇到400问题。
修改WebMvcAutoconfigur中的UrlPathHelper,这是因为UrlPathHelper中属性值removeSemicolonContent=true,属性的含义是删除分号,导致矩阵语法失效,从而导致400错误
- 将属性值修改即可
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.使用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 学习笔记心得请求参数处理的主要内容,如果未能解决你的问题,请参考以下文章