作为一名crud boy,关于web请求,接口处理基本是家常便饭,涉及到这些中间肯定少不了请求参数。毕竟要根据请求参数才能进行相应的操作,返回预想的结果。之前我以为这参数是框架自带的,实际上人家两个是货真价实的spring提供的注解。
@RequestParam Spring源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "nttnttnue000ue001ue002nttttn";
}
@RequestBody
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}
两个注解的作用都是处理请求参数,因为一般来说我们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也差不多,只不过他多了一步,就是注明参数名称,别如下面这个示例,要注明参数名是file
@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);
}