Restful使用put和delete传输参数无效

x33g5p2x  于9个月前 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(74)

项目场景:

Restful使用put和delete时data里面的参数传输无效

问题描述:

当我们遵循Restful风格编写代码时,前端页面发送ajax请求时,使用type为put/delete时,后台是接收不到前台发送的数据

1. 前台代码:
		$("#putOne").click(function () {
		//更新数据
            $.ajax({
                type:"put",
                url:"/team/"+$("#id").val(),
                //若data没有数据,可以接收到参数
                data:$("#form").serialize(),
                dataType:"json",
                success:function (data) {
                    alert(data);
                }
            })
        });
	2. 后台控制器
		@RequestMapping(value = "/team/{id}",method = RequestMethod.PUT)
	    @ResponseBody
	    public String update(@PathVariable("id") int id, Team team){
	        System.out.println(team);
	        for (Team team1:list) {
	            if(team1.getId() == id){
	                team1.setName(team.getName());
	                team1.setLocation(team.getLocation());
	                return "200";
	            }
	        }
	        return "500";
	    }

看debug结果,当前台发送数据时,我们明显的看到team中的三组数据都为null

原因分析:

Tomcat封装请求参数的过程:
		1.将请求体中的数据,封装成一个map
		2.request.getParameter(key)会从这个map中取值
		3.SpringMvc封装POJO对象的时候,会把POJO中每个属性的值进行request.getParamter();
		AJAX发送PU或者DELETE请求时,请求体中的数据通过request.getParamter()拿不到。
		Tomcat一检测到是PUT或者DELETE就不会封装请求体中的数据为map,只有POST形式的请求才封装请求为
		map。

解决方案:

  1. web.xml配置过滤器
<!-- 使用Rest风格的URI 将页面普通的post请求转为指定的delete或者put请求
	原理:在Aajx中发送post请求后,带_method参数,将其修改为PUT,或者DELETE请求-->
	<filter>
	<filter-name>httpMethodFilter</filter-name>
	<filter-class>
	org.springframework.web.filter.HiddenHttpMethodFilter
	</filter-class>
	</filter>
	<filter-mapping>
	<filter-name>httpMethodFilter</filter-name>
	<url-pattern>/*</url-pattern>
	</filter-mapping>
  1. 再次测试
1. 前台代码
		$("#putOne").click(function () {
            $.ajax({
                type:"POST",
                url:"/team/"+$("#id").val(),
                data:$("#form").serialize()+"&_method=put",
                dataType:"json",
                success:function (data) {
                    alert(data);
                }
            })
        });
	2. 控制器代码
		@RequestMapping(value = "/team/{id}",method = RequestMethod.PUT)
	    @ResponseBody
	    public String update(@PathVariable("id") int id, Team team){
	        System.out.println(team);
	        for (Team team1:list) {
	            if(team1.getId() == id){
	                team1.setName(team.getName());
	                team1.setLocation(team.getLocation());
	                return "200";
	            }
	        }
	        return "500";
	    }
  1. debug结果

相关文章