Http請求頭的Content-Type的幾種格式和對應的後端引數獲取
今天在前後端聯調開發過程中,出現了一個後端通過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()); JSONObjectobject = 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