javascript
requestbody接收不到参数_使用Spring MVC解析嵌套参数在三种 ContentType 下的绑定方式...
1.關(guān)于三種 Content-Type
multipart/form-data 請求中既可以攜帶文件,又可以攜帶參數(shù)。其中參數(shù)以鍵值對的方式傳遞,參數(shù)之間、參數(shù)與文件之間以 content-disposition 分隔;
application/x-www-form-urlencoded 只能上傳參數(shù),不能攜帶文件,參數(shù)通過 ?xxx=xxx&xxx=xxx 的方式被組織在一起;
application/json 只能上傳參數(shù),不能攜帶文件,參數(shù)不被特殊組織,保持原 JSON 字符串的形式
2.測試數(shù)據(jù)
這里采用嵌套數(shù)據(jù)如下:
{ "username": "dailybird", "password": "dailybirdo", "ids": [1,2,3], "detail": { "gender": "male", "location": "Beijing", "ids": [4,5,6] }}*與文件上傳相關(guān)的參數(shù)后面會單獨提到,這里先進(jìn)行非文件參數(shù)提交的實驗。
預(yù)期綁定的對象
public class User { private String username; private String password; private List ids; private Detail detail; public static class Detail { private String gender; private String location; private List ids; }}3. 綁定方式
3.1 利用 @RequestBody 解析 application/json 的 POST請求
控制器代碼如下:
@RequestMapping(value = "/application/json") public String applicationJson(@RequestBody User user) { log.info("{}", user.toString()); return user.toString(); }當(dāng)使用 POST,并攜帶 Content-Type: application/json 頭發(fā)送請求時,控制器能夠完全解析嵌套的參數(shù)。
由于 @RequestBody 本身是調(diào)用 HttpMessageConverter 解析請求體中的數(shù)據(jù),而 GET 方式的參數(shù)不會存在于請求體中,所以 @RequestBody 不能處理 GET 方式的請求。
3.2 利用 @RequestParam 接收 multipart/form-data 及 application/x-www-form-urlencoded 中的請求
控制器代碼如下:
public String xWwwFormUrlencoded(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("ids")List ids, @RequestParam("detail") Detail detail) { log.info("{}, {}, {}, {}", username, password, ids, detail); return ""; }其中 Detail 類為與之前 User 內(nèi)部類等同的類。
3.2.1 application/x-www-form-urlencoded
這里我們借助 jquery 的相關(guān)函數(shù)進(jìn)行測試:
Required List parameter 'ids' is not present但我們確實已經(jīng)發(fā)送了 ids 參數(shù),為什么沒有獲取到呢?這一點我們放到之后再談,先試一下 multipart/form-data 的方式。
3.2.2 multipart/form-data
當(dāng)然,采用這一方式,我們會收到同樣的提示:
Required List parameter 'ids' is not present原因是multipart/form-data本來就只能發(fā)送文件和不嵌套的鍵值對解決辦法就是把需要嵌套的json數(shù)據(jù)在發(fā)送前用JSON.stringify()方法轉(zhuǎn)為json字符串,放入form表單中,就可以了。
在 Spring MVC 中,我們可以不書寫 @RequestParam,直接使用與請求參數(shù)同名的變量進(jìn)行接收( 或直接使用一個 POJO 對象 ),但該方式也存在著與以上相同的問題。
3.3 文件上傳問題
最開始已經(jīng)說過,若要上傳文件,在上述三種 Content-Type 中,只能使用 multipart/form-data,在注意到 3.2 中所提到的問題后,我們便可以通過 MultipartFile 類型的屬性來獲取到文件參數(shù)了。
從 Laravel 過渡到 Spring Boot,確實感到了在控制器層面二者的差異( 當(dāng)然在 DAO 層更是如此 ),以下給出一個列表,用以紀(jì)念自己踩的坑:
總結(jié)
以上是生活随笔為你收集整理的requestbody接收不到参数_使用Spring MVC解析嵌套参数在三种 ContentType 下的绑定方式...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀上官婉儿的攻略有哪些(如何玩好《
- 下一篇: 养成类游戏有哪些