背景:后端接口入參比較多時會選擇使用對象去接收前端傳過來的json數據(使用@RequestBody注解),在使用過程中有遇到一些關於請求格式存在問題服務器響應不太友好的現象,特做優化記載。
問題:
做開放服務時有用到@RequestBody以復雜對象接收前端傳過來的json數據,當前端傳遞給后端的json數據出現格式問題,返回的響應信息不友好,例如:
后端對應的Controller:
/** * 新建任務 * * @param request * @return */ @RequestMapping("addTaskInfo.do") @ResponseBody public Message<Object> addTaskInfo(@RequestBody TaskConfSaveParam param, HttpServletRequest request) { Message<Object> message = new Message<Object>(); message.setData(JSON.toJSON(param)); return message; }
使用PostMan測試:
前端傳遞給后端的json數據:
響應:
優化:中心思想為 以String接收前端傳過來的json數據,然后將接收到json串做轉換,如果轉換出錯,則告訴用戶 “JSON入參格式錯誤”
@RequestBody直接以String接收前端傳過來的json數據:
后端對應的Controller:
/** * 新建任務 * * @param request * @return */ @RequestMapping("addTaskInfo.do") @ResponseBody public Message<Object> addTaskInfo(@RequestBody String paramStr, HttpServletRequest request) { Message<Object> message = new Message<Object>(); Object paramJson = null; try { paramJson = JSONObject.parse(paramStr); } catch (JSONException e) { logger.error("error", e); message.setCode(FdataConstants.EXECUTE_FAILED_PARAMS_ERROR); message.setMsg("JSON入參格式錯誤:"+ExceptionUtils.getMessage(e)); return message; } TaskConfSaveParam param = JSONObject.parseObject(paramStr, TaskConfSaveParam.class); message.setData(JSON.toJSON(param)); return message; }
使用PostMan測試:
前端傳遞給后端的json數據 & 響應:
參考文檔:https://blog.csdn.net/justry_deng/article/details/80972817