1.GET和POST請求,在傳參方面有什么區別
GET傳輸的數據存儲在URL上進行拼接 POST傳輸的數據存儲在Requst Body(請求體)中
2.http請求中的Content-Type
http的請求頭和響應頭中都有Content-Type字段,這個字段向我們說明了請求和響應的HTTP body(請求體或響應體)存儲了什么類型的數據,然后客戶端和服務端就可以根據http頭部得Content-Type正確解碼HTTP body內容。
關聯第1點
:GET方式的請求和Content-Type是沒有任何關系的,因為GET請求的數據在URL上。
這里我們分為3種情況說明如何傳參與接參,分別為 GET方式請求
、 表單提交
、 Json提交
1.GET方式請求
(1).普通URL get請求
http://localhost:8080/ajaxGet?id=1&username=用戶名&userTrueName=真實姓名 //get也可以傳json,通過參數傳json字符串,然后后端進行解析(不過一般都不這么做) http://localhost:8080/ajaxGet?user={"id":"1","username":"用戶名","userTrueName":"真實姓名"}
(2).表單類GET請求
<form id="fromGet" action="fromGet" method="GET"> <input type="text"name="id" value="1"> <input type="text"name="username" value="用戶名"> <input type="text" name="userTrueName" value="真實名字"> </form>
(3).AJAX Get請求
$.ajax({ type: "GET", url: "http://localhost:8080/ajaxGet", data:{"id":1,"username":"用戶名","userTrueName":"真實名稱"}, //contentType:'application/x-www-form-urlencoded' contentType:'application/json' });
注意:
1.data必須為json對象
2.實際上無需設置contentType
示例中我故意設置了contentType,但其實不管
設置成什么都是無效的
,因為傳輸的數據會在發送請求時,對Json對象進行編碼解析
,拼接到URL上,如下圖![]()
(B)錯誤示例(data為json字符串)
//data為json字符串
$.ajax({ type: "GET", url: "http://localhost:8080/ajaxGet", data:JSON.stringify({"id":1,"username":"用戶名","userTrueName":"真實名稱"}), //contentType:'application/x-www-form-urlencoded' contentType:'application/json' });
GET請求時,data不能使用json字符串,無法解析,如下圖
![]()
SpringMvc接收參數方式
1.實體類接收
2.Map接收,必須使用@RequestParam注解
3.拆開單個參數接收(參數少的情況可使用)
2.Form表單提交
ps:針對POST,第一點包含了所有GET請求方式
form表單提交一般說的是content-type為x-www-form-unlencoded或multipart/form-data的請求
(1) 傳統form表單提交,默認content-type為
x-www-form-unlencoded
,如下
<form id="fromPost" action="fromPost" method="POST"> <input type="text"name="id" value="1"> <input type="text"name="username" value="用戶名"> <input type="text" name="userTrueName" value="真實名字"> </form>
(2) 含文件的form表單,需要指明enctype為
multipart/form-data
(enctype相當於content-type)
<form id="fromMutli" action="fromMutli" enctype="multipart/form-data" method="POST"> <input type="text"name="id" value="1"> <input type="file" name="file"> </form>
(3) Ajaxform表單提交
//data為json對象 $.ajax({ type: "POST", url: "http://localhost:8080/ajaxPost", dataType: 'json', data:{"id":1,"username":"用戶名","userTrueName":"真實名稱"}, contentType:'application/x-www-form-urlencoded' });
SpringMvc接收參數方式
1.實體類接收 2.Map接收,必須使用@RequestParam注解 3.拆開單個參數接收(參數少的情況可使用) 4.后台的file文件需要使用MultipartFile類型接收
3.Json提交
ps:針對POST,第一點包含了所有GET請求方式
Json提交一般說的是content-type為application/json的請求,傳輸的Json是Json字符串
正確示例
//注意:data為json字符串 contentType為application/json $.ajax({ type: "POST", url: "http://localhost:8080/ajaxPost", dataType: 'json', data:JSON.stringify({"id":1,"username":"用戶名","userTrueName":"真實名稱"}), contentType:'application/json;charset=urf-8' });
注意:data為Json字符串,這個很重要
SpringMvc接收參數方式
必須使用@RequestBody注解
1.字符串接收,然后對Json字符串解析轉換
2.實體類接收
3.Map接收
如下:
@PostMapping(value = "ajaxPost") public void ajaxPost(@RequestBody String param){ JSONObject json = JSON.parseObject(param); } @PostMapping(value = "ajaxPost") public void ajaxPost(@RequestBody User user){ } @PostMapping(value = "ajaxPost") public void ajaxPost(@RequestBody Map map){ }
總結:1.GET請求方式與Form提交,后端spingMvc接收參數方式相同,如下
(1)實體類接收
(2)Map接收,必須使用@RequestParam注解
(3)拆開單個參數接收(參數少的情況使用)
(4)后台的file文件需要使用MultipartFil類型接收(form表單文件提交)
2.Json提交必須使用@RequestBody注解
(1)字符串接收,然后對json字符串解析轉換
(2)實體類接收
(3)Map接收
3.建議:
(1)參數少的查詢使用Get請求,參數多可使用Post
(2)涉及到數據庫的修改操作,使用Post請求
(3)Post請求統一使用Json提交(即content-type=application/json),統一方式方便前后端聯調,json傳參靈活
(4)參數多的,使用實體類接收,因為Map含有參數的不確定性,根本看不出你需要的啥參數,寧願新建一個實體類接收參數,可增強代碼的可讀性
比如使用swagger api文檔時,可使用注解標注的實體類對應參數,但用map的話,你要啥參數,鬼知道咯~
拓展知識:@RequestParam注解
其實使用注解@RequestParam就等同於request.getParamter獲取參數 但@RequestParam有更多的用處,它有以下幾個重要屬性
(1).value:前端傳參的參數名稱,這個屬性可以使得前端參數名字與方法參數名不相同,使用這個參數進行數據綁定就ok了
//前端傳參可以是"name" 方法參數中為"userName" //使用@RequestParam("name")可將name和userName進行綁定 //即可使用userName接收name的數據 @RequestMapping("/test") public void test(@RequestParam("name") String userName)){ }
(2)requried:表示是否是必須的參數,默認為true,所以加上@RequestParam,默認這個參數就是必須的,如果沒有傳對應參數會報錯
(3)defaultValue:參數默認值。即設置默認值后,沒有傳參時,會賦予參數一個默認值。設置了默認值,就算必須參數不傳也不會報錯