SpringMVC 接受前端傳參

一、前端傳參須要注意請求的Content-type:
主要使用的有兩種:application/x-www-form-urlencoded 、以及 application/json前端

二、application/x-www-form-urlencoded是瀏覽器的默認編碼格式 ,對於原生的form 表單提交參數,就是使用的這種方法。參數格式編碼後會成爲:key1=value1&key2=value2這樣的形式
它支持get和post兩種方式進行發送,對於get請求方式,會將編碼後的參數「key1=value1&key2=value2」添加到url的結尾。對於post方式的請求,會放在請求的body中。對於以這種編碼方式進行傳輸的請求參數,Controller端能夠直接經過 在方法中指定對應的參數名進行接收,或者經過Bean進行接收,Bean的成員變量名與請求的方法進行對應。web

@RequestMapping("/test")
@ResponseBody
public String test(User vo){ // Long id;String name
        System.out.println(vo.getId());
        return "ok";
    }

前端方法:ajax

xx.net.ajax({
      url: `xx/test`,
      method: 'get',
      data: { id: 1, name: "50" },
      success: data => {
        console.log("ok")
      }
    });

 若是這時在後端加註解@RequestBody,那麼會報錯:spring

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

 

三、若是前端框架,經過將參數經過JSON.stringfy(params)轉換成爲JSON字符串形式,那麼以application/x-www-form-urlencoded進行傳輸的時候,實際傳送的參數會是:json

{"id":1,"name":"50"}: 
//這樣的參數是不符合key-value形式的,由於轉完以後實際上參數成爲了json字符串,而非key-value字符串

這樣的參數,經過get發送時,會變成這樣:後端

http://localhost:8080/iwatch/api/v2/dashboard/test?{%22id%22:1,%22name%22:%2250%22}
(其實是對 {"id":1,"name":"50"}: 這樣的字符串進行了轉碼)
//view source:{%22id%22:1,%22name%22:%2250%22}
//view pased:{"id":1,"name":"50"}:

經過post發送時會是這樣:api

{"id":1,"name":"50"}: 
//view parsed如上面寫
//view source 內容以下圖

 

 

 這樣的形式,這樣在後端就會接收不到參數.所以對於將參數轉換爲JSON字符串以後,須要將content-type指定爲:application/json,纔可以正確的傳輸.而且須要配合使用post方法發送請求。瀏覽器

 

四、若是將參數對象轉爲了JOSN字符串,後端接受參數較爲嚴格:前端框架

須要app

a、使用content-type指定爲application/json

b、須要配合使用post方法,才能發送成功

xx.net.ajax({
      url: `xx/test`,
      method: 'get',
      data: JSON.stringify({ id: 1, name: "50" }),
      success: data => {
        console.log("ok")
      }
    });

c、後端須要指定:@RequestBody來 將參數綁定到bean .(能夠默認爲@RequestBody爲application/json編碼格式服務)

@RequestMapping("/test")
@ResponseBody
public String test(@RequsetBody User vo){ // Long id;String name
        System.out.println(vo.getId());
        return "ok";
    }

 d、當前端使用application/json編碼,而且參數爲json字符串後,就只能以post方法發送請求了,不然get請求後面的參數爲一個urlEncode以後的json字符串,根本無法發送參數。

http://localhost:8080/test?{%22id%22:1,%22name%22:%2250%22}
相關文章
相關標籤/搜索