作为一名crud boy,关于web请求,接口处理基本是家常便饭,涉及到这些中间肯定少不了请求参数。毕竟要根据请求参数才能进行相应的操作,返回预想的结果。
一般来说我们web请求参数是不能直接通过http请求来代码识别的,所以你必须要通过注解来告诉代码“不要傻等着参数像之前那样,方法间参数传递那样直接获取,作为一个成熟的web请求代码,要自己去http请求里找参数”
这里用到的注解可以是@RequestParam也可以是@RequestBody,分情况来选择。但是你不用的话,那你最后得到参数可能永远都是null。
一,@RequestParam和@RequestBody有啥区别
首先使用上,RequestParam对应的参数请求类型content-type一般是application/x-www-form-urlencoded或者multipart/form-data
这里的content-type你可以理解为媒体类型,x-www-form-urlencoded意思就是标准编码格式
multipart/form-data对应的是类似提交组件对应的,一般来说上传下载文件什么的经常会用到
想看你的请求的content-type可以尝试用postman这个工具来查看
比如我看一个下载文件的接口
看他的请求content-type要去头文件去看,注意打开hearder里面的hidden按钮
同理@RequestBody对应的是就是处理的请求类型不是application/x-www-form-urlencoded或者multipart/form-data,比如处理application/json、application/xml等类型的数据。
二,那些情况使用@RequestParam那些情况用@RequestBody
一般来说我们经常用的一般是@RequestBody,因为我们大多数请求都是application/json,好处有很多,结构化易理解,跟前者相比他可以批量化,可以通过json传多个对象信息过去。
,但是有的时候我们碍于一些原因,也会用到@RequestParam,比如文件的上传和下载,向我们spring中专门有个支持的类MultipartFile来支持这种请求。
总而言之,要看请求的类型来处理,比如json格式的@RequestParam可能无法处理,同理直接给一个MultipartFile 的file文件@RequestBody也无能为力。
二,实际代码中如何使用@RequestBody和@RequestParam
光知道什么情况来用还不行,最后还要落实到代码上
都是在对应的请求参数旁边加上,一般就是搭配@RequestMapping出现
@RequestBody的示例
@RequestMapping(value = "/querySumAsset", method = RequestMethod.POST)
public Result<TotalAssetResponse> querySumAsset(@RequestBody AssetSumParam assetSumParam) throws Exception {
return dataReportService.querySumAsset(assetSumParam);
}
@RequestParam也差不多,只不过他多了一步,就是注明参数名称
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public Result<List<Long>> upload(@RequestParam("file") MultipartFile[] files) throws Exception {
if (files.length == 0) {
throw new BusinessException(ErrorCode.FAIL);
}
return imageService.uploadImage(files);
}