spring mvc 參數接收

須要先了解關於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")));
}

總結:

  1. 對於 Request Payload 請求, 必須加 @RequestBody 才能將請求正文解析到對應的 bean 中。
  2. 對於 Form Data 請求,因爲多數後端服務器可以自動處理,除了接收數組這樣參數,不然基本不須要作特殊處理
相關文章
相關標籤/搜索