POST请求时
@RequestBody --> JSON字符串部分
@RequestParam --> 请求参数部分
application/json格局图

图一.png
form-data、x-www-form-urlencoded格局图

图二.png
1、从content-type方面总结:
① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。见postman的格局,这两种方式的时候没有json字符串部分。
② application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。见postman的格局
2、从两种注解方式总结:
@RequestBody
(@RequestBody Map map) (@RequestBody Object object) application/json时候可用 form-data、x-www-form-urlencoded时候不可用
@RequestParam
(@RequestParam Map map) application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,见图一 form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉
(@RequestParam String waterEleId, @RequestParam String enterpriseName) application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,见图一 form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉
(@RequestParam Object object) 不管application/json、form-data、x-www-form-urlencoded都不可用
既不是@RequestBody也不是@RequestParam,没有指定参数哪种接收方式
(Map map) (Object object) application/json时候:json字符串部分不可用,url中的?后面添加参数不可用。 因为没有指定,它也不知道到底是用json字符串部分还是?后面添加参数部分,所以干脆都不可以用 form-data、x-www-form-urlencoded时都不可用,见图二 (HttpServletRequest request) application/json不可用 form-data、x-www-form-urlencoded时可用
GET请求
@RequestBody
RequestBody -- Map / Object GET请求中不可以使用@RequestBody
@RequestParam
(@RequestParam Map map) 在url中的?后面添加参数即可使用
(@RequestParam String waterEleId, @RequestParam String enterpriseName) 在url中的?后面添加参数即可使用
(@RequestParam Object object) GET请求中不可以使用
当使用GET请求时,通过postman添加?后面的参数,不用在url中自己一个一个拼,点击Params,在下面key-value中输入就自动拼接到url中

GET请求问号后添加参数.png
举栗子
上传文件,包含了图中圈出来的两部分

图二.png
如果这样,没有@RequestParam,那么url?后的参数就拿不到
@RequestMapping(value = "/leadingIn", method = RequestMethod.POST) public ResponseObj<Boolean> leadingIn(Map formData, HttpServletRequest request, Map<String, InputStream> files) { }
如果control中这样接收,本来想formData只接收url?后的参数,结果将{ "retCode": null, "data": true }这部分内容也拿到了,真实意外之喜。字符串这部分内容还可以从request中取到,见下面完整方法。
@RequestMapping(value = "/leadingIn", method = RequestMethod.POST) public ResponseObj<Boolean> leadingIn(@RequestParam Map formData, HttpServletRequest request, Map<String, InputStream> files) { }
完整方法
/** * 导入 */ @RequestMapping(value = "/leadingIn", method = RequestMethod.POST) public ResponseObj<Boolean> leadingIn(@RequestParam Map formData, HttpServletRequest request, Map<String, InputStream> files) { //测试 try { MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request; Set<Map.Entry<String, MultipartFile>> set = mulRequest.getFileMap().entrySet(); Map<String, InputStream> listFile = new LinkedHashMap<>(); System.out.println("个数" + set.size()); for (Map.Entry<String, MultipartFile> each : set) { String fileName = each.getKey(); MultipartFile file = each.getValue(); //这里需要上传FTP try { listFile.put(fileName, file.getInputStream()); } catch (Exception ex) { return new ResponseObj<>(false, null); } } String formjson = mulRequest.getParameter("content"); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // boolean result = iInstallWorkOrder.upLoadFile(listFile); boolean result = true; return new ResponseObj<>(result, null); } catch (Exception ex) { System.out.println(ex.toString()); return new ResponseObj<>(false, null); } }
作者:墨色尘埃
链接:https://www.jianshu.com/p/4981911d5e15
来源:https://www.cnblogs.com/panchanggui/p/12172332.html