須要先了解關於http請求的content-type,html 中form表單默認content-type時application/x-www-form-urlencoded(ps:對參數進行編碼)。這是參數發送放在請求體中(Form Data). Form Data中的數據以鍵值對形式發送,後臺能夠直接解析,主要緣由是大多數後端服務器都對content-type爲application/x-www-form-urlencoded參數進行了特殊處理放在的鍵值對的數據結構中,若是mapjavascript
在使用jquery ajax是默認的content-type是application/x-www-form-urlencoded。而原生的ajax默認使用的content-type是text/plain,text/plain的參數是在request payload中,content-type爲application/json是發送的參數也是在request payload中,對於request payload中的數據,後臺是不能直接解析的,須要使用數據流來解析html
spring mvc接收json字符串前端
前端java
var data = { name:'zhangsan', color:['blue','red'] }; $.ajax({ url: '/user/jsonContent', type: 'post', contentType: 'application/json',//必須加上 data: JSON.stringify(data),//必須將對象轉成字符串 success: function (result) { }, error: function () { } });
針對上面方式發送的數據,經過瀏覽的控制檯,能夠看出發出的數據是在request payload中。jquery
後端:ajax
/** * 使用@RequestBody註解獲取json字符串參數 * ps:必須使用@RequestBody * @param user * @return */ @ResponseBody @RequestMapping(value = "jsonContent",method = RequestMethod.POST) public CommonResult testJsonContent(@RequestBody UserVo user){ System.out.println("user:"+JSON.toJSONString(user)); return new CommonResult(); }
重點:對於 Request Payload 請求, 必須加 @RequestBody
才能將請求正文解析到對應的 bean 中spring
spring mvc接收數組json
使用@RequestParam註解來接收數組,若是數組可能爲空則可設置required爲false來規避參數錯誤後端
前端數組
var data = { name:'zhangsan', resourceIds:['1','2'] }; $.ajax({ url: '/user/jsonContent', type: 'post', data: data,//必須將對象轉成字符串 success: function (result) { }, error: function () { } });
後端(list接收):
@ResponseBody @RequestMapping(value = "/grant",method = RequestMethod.POST) public CommonResult grant(int id,@RequestParam(value = "resourceIds",required = false) List<String> resourceIds){ CommonResult result = new CommonResult(); if(id<1){ result.setMessage("角色編號參數不正確,沒法分配權限"); return result; } return result; }
後端(數組接收):
@ResponseBody @RequestMapping(value = "/grant",method = RequestMethod.POST) public CommonResult grant(int id,@RequestParam(value = "resourceIds",required = false) String[] resourceIds){ CommonResult result = new CommonResult(); if(id<1){ result.setMessage("角色編號參數不正確,沒法分配權限"); return result; } return result; }
數組參數的單元測試例子:
@Test public void whenMultipleParameters_thenList() throws Exception { this.mockMvc.perform(get("/books") .param("authors", "martin") .param("authors", "tolkien") ) .andExpect(status().isOk()) .andExpect(model().attribute("authors", contains("martin","tolkien"))); }
總結:
@RequestBody
才能將請求正文解析到對應的 bean 中。