Jfinal框架下Controller無法獲取post請求傳入的引數
最近幾天在整合專案,把一個系統要分離成兩個系統,分離過程中出現了問題。
未分離之前,當系統裡的所有訪問都是直接呼叫類方法即可;分離之後,要通過http請求去呼叫相關介面。使用get請求時,通過getPara()可以直接獲取引數,但是使用post沒有引數,除錯發現訪問控制器的時候param不存在。
網上有詹大神給網友的解釋,當在post請求引數中設定Content-Type為application/json或者text/json時,request.getParameter()並不能取到對應的引數,就會導致JFinal的Controller中getPara()方法也無法取到對應的引數。當你看getPara()方法的原始碼時就會發現,Jfinal獲取引數是直接呼叫了HttpServletRequest類的request.getParameter()相關方法。
getPara()獲取不到,詹大神還為我們提供了一種暴力獲取引數的方式,HttpKit.readData(getRequest());這個方法可以獲取任何種類請求的引數。這樣我們可以通過全域性攔截器或者所有控制器繼承基類,基類中覆蓋getPara方法,先去判斷請求type,若為json相關的請求,先用暴力獲取方式。我自己找了一種解決辦法:
寫一個BaseController類,讓所有控制器類繼承,基類裡新增以下方法。
public Record getArgsRecord() {
String jsonStr = HttpKit.readData(getRequest());
System.out.println("接收的JSON引數:" + jsonStr);
if (StrKit.notBlank(jsonStr)) {
@SuppressWarnings("unchecked")
java.util.Map<String, Object> ls = FastJson.getJson().parse(jsonStr, java.util.Map.class);
Record r = new Record().setColumns(ls);
System.out.println("轉換為Record後的JSON引數:" + r.toJson());
return r;
} else {
return new Record();
}
}
當某個介面是被post請求時,就在相應的接口裡新增以下程式碼:
Record r = getArgsRecord();
String name = r.getStr("name");
int pId = r.getInt("pId");
int sortNum = r.getInt("sortNum");
int unitId = r.getInt("unitId");
這樣便可解決post請求無法獲取引數問題了。