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

项目场景:

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。

解决方案:

在这里插入图片描述
2. 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结果
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值