SpringBoot接收参数的几种常用方式_springboot 接收参数
阿里云国际版折扣https://www.yundadi.com |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
如果对@RequestMapping不是特别了解的建议读一下这篇文章 https://blog.csdn.net/weixin_43888891/article/details/126861310
参数映射准确来说是springmvc来帮我们干的活但是由于springboot太过火爆简化了springmvc相关配置文件以至于很多人会误认为是springboot的功能。其实springboot是帮我们整合了spring相关框架。记住只是简化底层还是不变的
一、四种传参方式
在学习接收参数前肯定要先了解一共有几种传参方式下面一共提供了四种供参考学习
1params传参params传参的格式是http://xxx?参数名=值&参数名=值
。在postman当中params当中添加参数会发现他就是在地址栏上加的参数。
2body表单传参就是请求体传参
form-data的请求是在body中为key=value格式同时可以传文件Content-Type为multipart/form-data后端可以用@RequestParam接收。
3json传参
json传参也是在body当中只不过json是一种数据格式后端可以用@RequestBody接收。
4地址栏传参直接通过/在地址上拼接参数值这种方式不需要在地址栏上写参数名后端只需要知道他在地址的哪个位置传的参数就可以拿到值
这两个实体类用来当做测试类用来接参数后续我们会不断的使用到他
public class Params {
private String userName;
private Integer age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Param{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
public class User {
private String userName;
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
'}';
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
二、无注解
import com.gzl.cn.demo.entity.Params;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/noAnno")
public class NoAnnoController {
@GetMapping("/url")
public String getMapping(String msg) {
return msg;
}
// 可以有多个实体类参数
@GetMapping("/body")
public String getMapping(Params param,User user) {
System.out.println(param);
System.out.println(user);
return param.toString();
}
@PostMapping("/post")
public String postMapping(String msg) {
return msg;
}
@PostMapping("/post-body")
public String postMapping(Params msg) {
return msg.toString();
}
}
以下是测试的详细步骤
1测试无注解params传参
测试get请求
http://localhost:8080/noAnno/url?msg=111
http://localhost:8080/noAnno/body?userName=张三&age=11
测试post请求post请求我们无法通过浏览器来访问得需要借助postman调用
http://localhost:8080/noAnno/post?msg=111
http://localhost:8080/noAnno/post-body?userName=张三&age=22
当然也可以借用cmd框当中的curl命令来请求post
curl http://localhost:8080/noAnno/post-body -X POST -d "userName=66&age=22"
2测试无注解body表单传参
3测试无注解params传参+body表单传参 两种同时传参
总结
- 没有注解的时候可以选择
params传参
也可以选择body表单传参
甚至可以两种同时传两种同时传会将body传的参数使用逗号
拼接上params传的参数 - 不管是body还是params 在不传参的情况下都不会报错
在后端会拿到null值
这块需要注意一下假如是null值的情况下去get属性或者是tostring就会空指针如果传参的话参数名要和controller当中定义的变量名一样
才能接受到参数任意请求方式
都是一样的 - 可以有多个参数的如果是实体类接参数的话也是可以有多个实体类的就算两个实体类当中有参数重复了也不影响两个实体类都会接到参数的
三、@RequestParam
http://localhost:8089/conformity/parm/requestParm8?uid=1&uname=222&pwd=2222
就是在地址然后加上&拼接。
不携带@RequestParm
的时候可以连key值都不传。
@GetMapping("/requestParm")
public void requestParm(Integer id){
System.out.println("get不带@RequestParam:"+id);
}
携带@RequestParm
的时候必须传值。因为@RequestParam注解的required默认是true
。假如不传会报错。
@GetMapping("/requestParm1")
public void requestParm1(@RequestParam Integer id){
System.out.println("get带@RequestParam:"+id);
}
@RequestParam
接收参数不可使用使用实体来封装如下所示直接会报400错误。- 不带
@RequstParm
然后使用实体来接参数其实是没问题的并且不传key值也是可以的。post、get都一样。
// 错误的
@PostMapping("/requestParm7")
public void requestParm7(@RequestParam User user){
System.out.println("get带@RequestParam:"+user);
}
@RequestParam
参数映射注意@RequestParam默认是以变量名作为前端传参名称但是假如我们注解设置了名称如下那么参数名称以注解当中的属性为准假如前端传msg而不是msg1就会报异常。
@GetMapping("/url")
public String getMapping(@RequestParam("msg1") String msg) {
System.out.println(msg);
System.out.println(aaa);
return msg;
}
总结
1、传单个参数的时候可以使用@RequestParam不带也可以带上就意味着前端必须传这个值。
2、实体接受参数的话不可以带带上就会报错。不带的话是可以接受多个参数的。并且没有key限制。
@RequestParam的属性
value
和name
属性使用了@AliasFor
在spring当中起着一个注解属性别名传递值的作用。也就是我给value属性赋值name属性同样也能取到值name属性赋值value属性也同样可以取到值。
@RequestParam(value = "msg")
等同于@RequestParam("msg")
因为注解当中不带属性名称默认指的就是value属性而@RequestParam("msg")
等同于@RequestParam(name = "msg")
。required
属性代表的是否是必填默认是true这个true代表的是前端必须传key值value值可以随意但是key值是必须的。假如不传就是400异常defaultValue
属性设置默认值可以避免required
属性设置为true然后前端不传key值报错的问题。相当于设置defaultValue属性之后前端传不传值都可以传值就以前端的为准不传值就以设置的defaultValue值为准示例如下
@RequestParam(name = "pageNo",required = false,defaultValue = "1") Integer pageNo
@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 ValueConstants.DEFAULT_NONE;
}
四、@PathVariable
@PathVariable
用于绑定 url 中的占位符。例如请求 url 中 /delete/{id}
这个{id}
就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
@RequestMapping("/pathVariable2/{id}")
public void pathVariable2(@PathVariable Integer id){
System.out.println("get带@RequestParam:"+id);
}
上面代码示例使用了地址栏传参就算不带@PathVariable也可以访问只不过接不到值。
@PathVariable 的属性
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
}
总结
- 如果@PathVariable不设置属性值默认的话只要参数名称和占位符当中的名称一致就可以如果名称不一致就会报错
- 一旦设置属性值了就一定要和占位符当中的一致否则就会报错
五、@RequestBody
@RequestBody一般被用来接收http请求中body中json数据。
get、post都可以使用。一般用于post。
@RequestMapping("/requestBody2")
public void requestBody2(@RequestBody Params params){
System.out.println("get带@RequestParam:"+params);
}
{"userName":"111","age":"11"}
传输json数据也可以不传key。这里有一点需要注意mvc给我们做了参数类型转换Params 对象当中的age是Integer类型但是json传字符串照样可以映射进去。Boolean、BigDecimal、Integer、String、Date
这些其实都可以映射进去的。当然Date相对来说比较特殊一点。传yyyy-MM-dd
格式是不会报错的。但是其他格式可能就会报错了一般使用Date类型接参数涉及到需要咱们自己格式化关于日期相关问题感兴趣的可以看这一篇文章https://blog.csdn.net/weixin_43888891/article/details/126846791
@RequestBody 的属性
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}
- required默认为true代表的就是json不能什么都不传否则报错400但是允许个别属性不传。
- 设置为false的话就是可以什么都不传。
六、@RequestHeader
@RequestHeader主要用来获取请求当中的请求头
@RestController
@RequestMapping("/requestHeader")
public class RequestHeaderController {
@PostMapping("/header")
public String getMapping(@RequestHeader("param")String param){
return param;
}
}
我们通过header进行参数传递同样它可以设置是否必传默认值等请大家自行翻阅源码就不一一罗列了。
七、HttpServletRequest
这是直接拿到request对象通过request可以从对象中灵活的获取参数:
@RestController
@RequestMapping("/request")
public class HttpServletRequestController {
@GetMapping("/getUrlValue")
public String getUrlValue(HttpServletRequest request) {
// 没有的时候不会报错直接为null
String msg = request.getParameter("msg");
System.out.println(msg);
return msg;
}
@GetMapping("/getUrlValues")
public String getHttpServletRequestValue(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
return JSONObject.toJSONString(request.getParameterMap());;
}
}
针对于
request.getParameter("msg");
其实就是跟@RequestParam差不多可以获取到body当中的for-data
的数据以及使用url
拼接的参数的数据