在前端的開發過程中,經常在html頁面通過ajax進行前后端數據的交互,SpringMVC的controller進行數據的接收,但是有的時候后端會出現數據無法接收到的情況,這個是因為我們的參數和前端ajax的contentType參數 類型不對應的情景,或者說contentType和后臺controller 方法參數到底存在什么樣的關系
普通的參數我們傳遞的時候往往是這樣的兩種情況:
contentType: "application/x-www-form-urlencoded",
contentType: "application/json",
這樣的兩種方式有什么樣的區別,
第一種方式:application/x-www-form-urlencoded 參數會解析為參數表,比如:
-
name=John+Doe&age=30&city=New+York
?通過ajax 傳遞,ajax寫法如下:
let params={"username":"張三","password":"123456",}$.ajax({url: "dologin4",contentType: "application/x-www-form-urlencoded",headers: { 'Authorization': "****",'Access-Control-Allow-Origin':'*'},type: 'post',data: params,success: function(result) {console.log(result)},error: function(data) {console.log('接口不通');}});
這樣的形式,后臺接受的時候,使用:request.getParameter()
或@RequestParam,比如:
@RequestMapping("/dologin")public ModelAndView dologin(@RequestParam String username,@RequestParam String password) throws Exception {System.out.println(username);System.out.println(password);ModelAndView mav = new ModelAndView();mav.addObject("info", "歡迎你");mav.setViewName("success");return mav;}@ResponseBody@RequestMapping("/dologin2")public Map<String,Object> dologin2(HttpServletRequest request,HttpServletResponse response) throws Exception {String username=request.getParameter("username");System.out.println(username);Map<String,Object> map=new HashMap<>();map.put("aa", "1111");return map;}
?
適合?x-www-form-urlencoded
?的情況:
-
傳統HTML表單提交
-
簡單的鍵值對數據
-
需要向后兼容老系統
-
文件上傳(結合
multipart/form-data
)
第二種方式:contentType: "application/json", 整個body作為單一數據流處理,比如:
{"name": "John Doe","age": 30,"city": "New York","hobbies": ["reading", "swimming"] }
通過ajax 傳遞,ajax寫法如下:
function dologin(){let params={"username":"張三","password":"123456",}$.ajax({url: "dologin4",contentType: "application/json",headers: { 'Authorization': "****",'Access-Control-Allow-Origin':'*'},type: 'post',data: JSON.stringify(params),success: function(result) {console.log(result)},error: function(data) {console.log('接口不通');}});}
Java后臺接受前臺傳入參數的代碼如下:@RequestBody
@ResponseBody@RequestMapping("/dologin4")public Map<String,Object> dologin4(HttpServletRequest request,HttpServletResponse response) throws Exception {String uu=request.getParameter("username");System.out.println(uu);StringBuilder jsonBuilder = new StringBuilder();try (BufferedReader reader = request.getReader()) {String line;while ((line = reader.readLine()) != null) {jsonBuilder.append(line);}}String jsonString = jsonBuilder.toString();ObjectMapper mapper = new ObjectMapper();Map<String, Object> jsonMap = mapper.readValue(jsonString, Map.class); String username = (String) jsonMap.get("username");System.out.println(username);Map<String,Object> map=new HashMap<>();map.put("aa", "1111");return map; }@ResponseBody@RequestMapping("/dologin3")public Map<String,Object> dologin3(@RequestBody Map<String,Object> reqMap) throws Exception {String username=reqMap.get("username").toString();System.out.println(username);Map<String,Object> map=new HashMap<>();map.put("aa", "1111");return map;}
適合?application/json
?的情況:
-
RESTful API通信
-
復雜數據結構
-
需要明確數據類型
-
前后端分離架構
-
移動應用與服務器通信
兩種情景是不一樣的,如果你前端傳入的是json格式,那么后端你用:
?? ?String uu=request.getParameter("username");
?? ?System.out.println(uu);
這樣是無法接收到數據的,接收到的參數一直為null,因為json是整體作為一個流傳入到后臺的
希望對你有所幫助!