请求参数处理
请求映射与Rest原理
- xxxMapping;
- Rest风格
以前
/getUser 获取用户
/deleteUser 删除用户
/editUser 修改用户
/saveUser 保存用户
现在
/user
GET-获取用户
DELETE-删除用户
PUT-修改用户
POST-保存用户
我们先写一个简单的映射请求
controller包里的:
@RestController
public class HelloController {
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
return "GET-张三";
}
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String saveUser(){
return "POST-张三";
}
@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String putUser(){
return "PUT-张三";
}
@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(){
return "DELETE-张三";
}
}
index.html里面写一个简单的表单提交:
<form action="/user" method="get">
<input type="submit" value="REST-GET">
</form>
<form action="/user" method="post">
<input type="submit" value="REST-POST">
</form>
<form action="/user" method="put">
<input type="submit" value="REST-PUT">
</form>
<form action="/user" method="delete">
<input type="submit" value="REST-DELETE">
</form>
<hr>
项目启动后:
当我门去点击各自的表单提交时,会发现put和delete的方法没有返回我们预期的结果
当我们点击REST-GET
时,返回 GET-张三
当我们点击REST-POST
时,返回 POST-张三
当我们点击REST-PUT
时,返回 GET-张三
当我们点击REST-DELETE
时,返回 GET-张三
原因是我们在SpringBoot的表单提交里写的不支持put和delete方法,默认会返回get
解决方法:
1.index.html 在form表单里先去修改代码
原来的代码:
<form action="/user" method="put">
<input type="submit" value="REST-PUT">
</form>
<form action="/user" method="delete">
<input type="submit" value="REST-DELETE">
</form>
修改后的代码:
<form action="/user" method="post">
<!-- 将post隐藏起来,真正的指向的方法是put -->
<input type="hidden" name="_method" value="put">
<input type="submit" value="REST-PUT">
</form>
<form action="/user" method="post">
<!-- 将post隐藏起来,真正的指向的方法是delete-->
<input type="hidden" name="_method" value="delete">
<input type="submit" value="REST-DELETE">
</form>
2.而我们想要使用REST风格,就得在SpringBoot中手动开启(yml文件中进行配置)
开启页面表单的Rest功能(选择性开启,前后端分离要使用)
spring:
mvc:
hiddenmetnod:
filter:
enable: true
然后再次启动项目,去点击表单提交:
当我们点击REST-GET
时,返回 GET-张三
当我们点击REST-POST
时,返回 POST-张三
当我们点击REST-PUT
时,返回 PUT-张三
当我们点击REST-DELETE
时,返回 DELETE-张三
此时我们的put和delete就可以使用了.
表单提交要带上_method=真正请求的参数
请求过来被 HiddenHttpMethodFilter拦截,
1.请求是否正常,并且是POST方式,正常的话获取到_method的值
2.兼容以下请求:put,delete,patch
3.原生Request是POST方式,包装模式RequesWrapper重写了getMethod方法.返回的是传入的值(_method)
4.过滤器放行的是wrapper。以后的方法调用getMethod是调用的requesWrapper
Rest使用客户端工具
- 如PostMan直接发送put,delete等方式,无需Filter
SpringMVC里面派生了一些新的注解,大大简化了上述controller里面的代码
@RequestMapping(value = "/user",method = RequestMethod.GET)
相当于 @GetMapping("/user")
@RequestMapping(value = "/user",method = RequestMethod.POST)
相当于 @PostMapping("/user")
@RequestMapping(value = "/user",method = RequestMethod.PUT)
相当于 @PutMapping("/user")
@RequestMapping(value = "/user",method = RequestMethod.DELETE)
相当于 @DeleteMapping("/user")