解決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