ajax PUT提交,data里的參數后端取不到


做個批量處理訂單的功能,前端backbone,對於restful api的接口設計上,用backbone自己去判斷是update操作,然后發送PUT請求,再加上參數,總感覺不好。

還是用$.ajax吧,type設置為PUT,當參數放在data里時,后端是取不到的,拼在url里可以。

暫時先拼在ajax的url里吧。

 

SpringMVC控制器接收不了PUT提交的參數的解決方案

這次改造了下框架,把控制器的API全部REST化,不做不知道,SpringMVC的REST有各種坑讓你去跳,順利繞過它們花了我不少時間,這次來提下SpringMVC的PUT提交參數為null的情況。

照常先貼出我的控制器代碼,沒什么特別的,就是打印出接受到的前台參數值:

 

?
1
2
3
4
5
6
7
8
9
10
11
@RequestMapping (value = "/{id}" , method = RequestMethod.PUT)
     @ResponseBody
     public Map<String, Object> update(
             @RequestParam (value = "isform" , required = false ) String isform,
             @PathVariable ( "id" ) String id) {
         System.out.println( "id value: " + id);
         System.out.println( "isform value: " + isform);
 
         return null ;
 
     }

很常規的PUT控制器,用來修改原有的記錄,原有的的web.xml中,我只添加了一個和REST涉及的過濾器

 

org.springframework.web.filter.HiddenHttpMethodFilter

 

?
1
2
3
4
5
6
7
8
< 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 >

這個因為大多數人都知道它的作用,這里再啰嗦提一下:

 

        瀏覽器form表單只支持GET與POST請求,而DELETE、PUT等method並不支持,spring3.0添加了一個過濾器,可以將這些請求轉 換為標准的http方法,使得支持GET、POST、PUT與DELETE請求,該過濾器為HiddenHttpMethodFilter,只需要在表單中添加一個隱藏字段"_method"

 

?
1
2
3
4
< form action = "..." method = "post"
             < input type = "hidden" name = "_method" value = "put" /> 
             ...... 
     </ form >

下邊我們來看下,運行的結果,我會在我的前台發起一個PUT請求作為案例,

 

我們來看下后台的參數打印情況:

id參數順利的獲取到了,因為它其實是由@PathVariable獲取的,這個沒有什么問題,但是http body中提交的參數值isform卻為null,查詢了一番,原因是:

如果是使用的是PUT方式,SpringMVC默認將不會辨認到請求體中的參數,或者也有人說是Spirng MVC默認不支持 PUT請求帶參數,

解決方案也很簡單,就是在web.xml中把原來的過濾器改一下,換成org.springframework.web.filter.HttpPutFormContentFilter

?
1
2
3
4
5
6
7
8
< filter >
         < filter-name >HttpMethodFilter</ filter-name >
         < filter-class >org.springframework.web.filter.HttpPutFormContentFilter</ filter-class >
     </ filter >
     < filter-mapping >
         < filter-name >HttpMethodFilter</ filter-name >
         < url-pattern >/*</ url-pattern >
     </ filter-mapping >

在更改之后我們繼續一下剛才的案例,發送一個PUT請求,參數基本都不變

看下后台打印的結果:

ok,現在已經可以成功的獲取並打印出前台的參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM