1.請求參數格式必須是正確的JSON。
2.在入參中使用注解@RequestBody,用於接收JSON參數,使其自動轉對象
3.關於lombok在此產生的一點小坑,@Builder對@RequestBody的影響
4.標識請求參數的格式為JSON--->> @PostMapping(value="/Test",produces = "application/json;charset=UTF-8")
1.后端代碼
@RestController @RequestMapping("/Test") public class TestController { @PostMapping(value="/Test",produces = "application/json;charset=UTF-8") public ContentSet Test(@RequestBody CommandInfo commandInfo){ System.out.println(commandInfo); return null; } }
2.實體類代碼
@Getter @Setter @ToString public class CommandInfo implements Serializable { private int XXX; private int ZZZ; private Map<String,String> ,mapPamater; }
3.PostMan模擬請求
方法二:
@RequestMapping(value = "/addStockInAndDetails", method = RequestMethod.POST, produces = "text/html;charset=UTF-8") @ResponseBody @ApiOperation(value = "add in stock and details", notes = "商品入庫") @ApiResponse(response= String.class, code = 200, message = "接口返回對象參數") public String addStockInAndDetails(@RequestBody StockInDetails details) { System.out.println("-----------------"+details); try { if(details==null) { return "parameterError"; } StockIn stockIn = new StockIn(details.getInCode(), details.getSupplyId(), details.getInStatus(), details.getInTime()); stockInService.insert(stockIn); if(stockIn.getInId()>0) { for (StockInDetail detail : details.getDetails()) { detail.setInId(stockIn.getInId()); stockInDetailService.insert(detail); } } return "success"; } catch (Exception e) { e.printStackTrace(); return "fail"; } }
對於第二種方法,前端ajax使用情況:
//添加商品 $("#btnSave").click(function(){ var addInCode = $("#addInCode").val(); var AddSupply = $("#AddSupply").val(); var date = new Date(); var createTime = dateFormat("YYYY-mm-dd HH:MM:SS", date); if(addInCode == ""){ alert("入庫單號不能為空"); return ; } var details = $("#stockInDetailTab").bootstrapTable('getData'); var paramData = { "details": details, "inCode": addInCode, "inStatus": "0", "inTime": createTime, "supplyId": AddSupply }; var addUrl = baseUrl + "/Inventory/repair/StockIn/addStockInAndDetails"; $.ajax({ type: 'POST', url: addUrl, dataType: 'json', cache: false, headers : { 'Content-Type' : 'application/json;charset=utf-8' }, data: JSON.stringify(paramData), success: function (data) { if(data == "success"){ $('#addModal').modal('hide'); InitTable(url); }else{ alert("添加失敗"); } }, error: function(er){ if(er.responseText == "success"){ $('#addModal').modal('hide'); InitTable(url); }else{ alert("添加失敗"); } } }); });
原因:
@RequestParam 底層是通過request.getParameter方式獲得參數的,也就是說,@RequestParam 和request.getParameter是同一回事。
因為使用request.getParameter()方式獲取參數,可以處理get 方式中queryString的值,也可以處理post方式中 body data的值,所以,@RequestParam可以處理get 方式中queryString的值,也可以處理post方式中 body data的值。
@RequestParam用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST。
@RequestBody接受的是一個json對象的字符串,而不是Json對象,在ajax請求時往往都是Json對象,用JSON.stringify(data)的方式就能將對象變成json字符串。
@RequestBody接收的是一個字符串,返回的參數可以是一個Map對象。