解决Ajax中Restful风格PUT和DELETE请求传递参数无效(转)


问题:在Ajax中,采用Restful风格PUT和DELETE请求传递参数无效,传递到后台的参数值为null

原因:
* Tomcat
*       1.将请求体中的数据,封装成一个map
*       2.request.getParameter("id")就会从这个map中取值
*       3.SpringMvc封装POJO对象的时候,
*            会把POJO中每个属性的值进行request.getParamter();
*
*  AJAX发送PUT请求引发的
*     PUT请求,请求体中的数据,request.getParamter()拿不到
*     Tomcat一看是PUT就不会封装请求体中的数据为map,只有POST形式的请求才封装请求为map

 
解决方案:   

       1、 能支持直接发送PUT之类请求还要封装请求体中的数据,但是不支持DELETE
      在web.xml中配置上HttpPutFormContentFilter,
       作用:将请求体中的数据解析包装成一个map

       request被重新包装,request.getParameter()被重写,就会从自己封装的map中取数据

       (局限性:仅仅适合表单对象信息的传参,如果是单个信息数据不通过表单,例如,简单传入一个id,来更新特定数据就发现还是无法传参)

    <!-- 将put请求的数据转换成一个Map数据后返回成request,并重写getParmater方法
             简要的说:就是把put的数据封装了,并可以用request.getParameter获取属性 -->
        <filter>
         <filter-name>HttpPutFormContentFilter</filter-name>
         <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
        </filter>
        <filter-mapping>
        <filter-name>HttpPutFormContentFilter</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>

      配置完后,当更新对象,ajax传参时,直接在参数设置 type:"PUT" 就行。

2、 支持PUT,DELETE请求

    在web.xml中配置

    <!-- 使用Rest风格的URI 将页面普通的post请求转为指定的delete或者put请求-->
        <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        </filter>
        <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>

  原理是:在Aajx中发送post请求后,带_method参数,将其修改为PUT,或者DELETE请求

例子:JS代码中该为

    $.ajax({
                       url:"${APP_PATH}/RecordController/record",
                       type:"POST",
                       data:{id :id ,
                           _method:"PUT"},
                       success:function(result){
                           alert("update success");
                       }
                       });

 或者在url中加&_method=”PUT”或者&_method=”DELETE”即可
---------------------

原博客信息:
作者:放牧娃子
来源:CSDN
原文:https://blog.csdn.net/xc121566/article/details/79673315

=======================================================

AJAX发送 PUT和DELETE请求注意事项

ajax使用restful服务发送put 和 delete 请求时直接传参会出现问题
一,采用POST  + _method:delete/put  + filter 的方法

ajax发送put 和 delete 请求时,需要传递参数,如果参数在url地址栏上,则可以正常使用,

如果在 data:中需要传递参数,(浏览器会使用表单提交的方式进行提交) 则需要注意此时应作如下修改:

 1.  请求方式设置为    type:"post",

2. 在data中加入 __method:"DELETE",或者 _method:"PUT" 参数 ,

data:{_method:"DELETE", id:issueId,userId:userId},

3.后台的controller 仍为对应的DELETE 请求

    @RequestMapping(value="/answer/{answerId}",method=RequestMethod.DELETE)
    public ResponseResult deleteAnswer(@PathVariable("answerId")int answerId,Issue issue){
        //可自动封装成对象时,可直接采用对象参数
    }

4.需要配置相应的filter(如果使用Spring Boot 则会自动配置)

    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <!-- 备注,这边的名称必须和配置'springmvc'的servlet名称一样 -->
        <servlet-name>springmvc</servlet-name>    
    </filter-mapping>  

ajax代码如下 :

     
    var r=confirm("确认删除该?");
    if(r){
      $.ajax({
        url:"http://localhost:8888/answer/"+answerId,
        type:"POST",
        data:{_method:"DELETE", id:issueId,userId:userId},
        dataType:"json",
        success:function(result){
            }
                                
       },
                
     });


一,仍然使用PUT DELETE 请求
1.仍然使用put和delete请求,并且需要传递参数的时候data需要设置为json字符串

    var jsonstr = {"id":issueId,"userId":userId};
    var r=confirm("确认删除该回答?");
    if(r){
       $.ajax({
        url:"http://localhost:8885/answer/"+answerId,
        type:"DELETE",
        contentType:"application/json",//设置请求参数类型为json字符串
        data:JSON.stringify(jsonstr),//将json对象转换成json字符串发送
        dataType:"json",
        success:function(result){
        
            },
                
       });
    }

客户端需要使用@RequestBody标注

    @RequestMapping(value="/answer/{answerId}",method=RequestMethod.DELETE)
    public ResponseResult deleteAnswer(@PathVariable("answerId")int answerId,@RequestBody Issue issue){
        
    }


最后如果前端报错 提示 Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response , 可参考如下解决方案

https://stackoverflow.com/questions/12409600/error-request-header-field-content-type-is-not-allowed-by-access-control-allow

可以写一个过滤器

    @WebFilter(servletNames={"dispatcherServlet"})//可配置对应的请求servlet 此处使用 springMVC
    public class AjaxFilter implements Filter{
        
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponse httpServletResponse=(HttpServletResponse) response;
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            httpServletResponse.setHeader("Access-Control-Allow-Methods","GET,POST,DELETE,PUT");
            httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept");              
            chain.doFilter(request, response);      
        }
     
       
     
    }
---------------------

原博客信息:
作者:liuyuanjiang109
来源:CSDN
原文:https://blog.csdn.net/liuyuanjiang109/article/details/78972644 

 

其他参考资料:

springmvc put请求无法解析请求体参数解决办法

springMVC使用PUT、DELETE方法传递参数解决方案

springmvc使用put,delete方法传参问题

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM