今天在前后端聯調開發過程中,出現了一個后端通過request.getParameterMap()方法獲取不到請求參數的問題,所以在此做一個記錄,並提出解決方案。
首先,出現問題是因為數據格式為Request Payload,是在react使用axios進行ajax請求的時候出現的,原來,axios中默認請求頭的編碼為application/json;charset=UTF-8,即Content-Type = "application/json;charset=UTF-8",這個時候可以通過數據流的讀取進行參數解析,經測試,方法為通用方法,對於ajax請求適用,代碼如下
————————————————
版權聲明:本文為CSDN博主「z-m-k」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/q1937915896/article/details/89556682
//將請求參數類型為request payload格式的請求參數封裝成一個Map //該方法為通用方法 public static Map<String,String> requestPayload2Map(HttpServletRequest request){ Map<String,String> reqParams = new HashMap<>(); StringBuilder sb = new StringBuilder(); //從請求流中讀取數據 try( BufferedReader reader = request.getReader();) { char[] buffer = new char[1024]; int len = 0; while((len = reader.read(buffer))!=-1){ sb.append(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } System.out.println("數據為:"+sb.toString()); JSONObject object = JSONObject.fromObject(sb.toString()); for (Object key :object.keySet()) { reqParams.put((String)key,(String)object.get(key)); } return reqParams; }
這里,我們修改了Content-Type的值,application/x-www-form-urlencoded是窗體數據被編碼為名稱/值對。這是標准的編碼格式我們就有一個疑問,為什么我們的那個方法依然失效呢,經過多種方式測試,發現,我們要使用的方法如果在后台的得到的數據格式為XX1=XXX1&XX2=XXX2,那么我們就可以使用成功了,即通過表單的action方式
當使用表單的action提交的時候,如果設置了屬性encType = "multipart/form-data",那么后台獲取到的數據格式為:
————————————————
版權聲明:本文為CSDN博主「z-m-k」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/q1937915896/article/details/89556682
數據為:------WebKitFormBoundaryN4vBMLIkQoIBjLqe Content-Disposition: form-data; name="usename" liming ------WebKitFormBoundaryN4vBMLIkQoIBjLqe Content-Disposition: form-data; name="password" 123456 ------WebKitFormBoundaryN4vBMLIkQoIBjLqe--
此時的Content-Type為Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryN4vBMLIkQoIBjLqe,所以建議在使用ajax的時候,最好使用通用方法進行參數獲取,以便少走彎路。。。
————————————————
版權聲明:本文為CSDN博主「z-m-k」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/q1937915896/article/details/89556682