一、前提知识:

  1. http协议规定一次请求对应一次响应,根据不同的请求方式,请求的内容会有所不同;

  2. 发送GET请求是没有请求体的,参数会直接拼接保留到url后一并发送;

  3. 而POST请求是带有请求体的,带着请求体一并发送,每次请求请求体只会有一个;

二、注解介绍

@RequestParam注解:将返回到后端的请求参数绑定到控制器方法参数,该注解有两个需要了解的属性

  1. 一个是required属性,默认是true

    当该属性为true的时候,且指定了value属性时,如果前台页面的key跟接收的value不同是是会报400错误的;

    而当该属性为false的是会,即使key不存在,也不会报400的错;

    ️但是当后面的参数的基本数据类型的时候,是会报500错误的,因为当找不到值的时候,会默认返回一个null,基本数据类型接收到null,直接就会报错,解决方法就是使用对应的引用类型去接收,即使时null也不会报错

  2. 另一个是defaultValue属性,默认值是16个Unicode字符

    使用了该属性之后,且指定了value属性,但是前端页面并没有给对应的key时,就会默认采用这个自动值,底层会帮我们自动转换成参数类型

️ 绑定的方法参数是附加到url后的[key-value]格式的值,进而衍生出也可以是数组、对象或者集合,接下来会进行演示

@RequestBody跟@ResponseBody:这两个注解的作用其实是一样的,处理的都是json字符串,只不过前一个注解是从前往后传,第二个注解是从后往前传,接下来也会样式这两个注解的使用方式

️ 所以讲到这里其实应该明白,@RequestBody注解在一个方法中只会出现一次,而@RequestParam则可以出现多个,这是因为@RequestBody接收的是整个请求体的json格式化字符串,而@RequestParam接收的是附加到url后面的[key-value]形式值,会存在多个这样的值,所以自然也可以使用多个@RequestParam注解来接收,如果是较少的参数那还好,如果太多的参数,一个一个获取就太麻烦了,而且写出来的代码也不够优雅整洁。

@PathVariable的作用其实就是接收url后面传过来的变量,这个注解使用起来很简单

三、注解的简单演示

是基于springboot环境,使用postman来测试

一、@RequestParam注解

  1. 简单使用,接收url后面的 key-value值

    //测试的接口 : localhost:8080/testRequestParam/one?name=Amg&age=22
    ​
    @RestController
    @RequestMapping("/testRequestParam")
    public class TestRequestParamAnno {
    ​
    @GetMapping("/one")
    public Result one(@RequestParam(value = "name") String name,
    @RequestParam(value = "age") int age){ System.out.println(name + " / " + age);
    return ResultGenerator.getSuccessful(name + " / " + age);
    }
    ​
    }
    ​
    //output ResultGenerator返回的是一个对象,通过@ResponseBody转换成json字符串格式
    {
    "code": 200,
    "msg": "Amg / 22"
    }
     

    2.测试添加required属性跟defaultValue属性

    //测试的接口: localhost:8080/testRequestParam/two?name=Amg&=
    ​
    @GetMapping("/two")
    public Result two(@RequestParam(value = "name") String name,
    @RequestParam(value = "age") int age) {
    ​
    System.out.println(name + " / " + age);
    return ResultGenerator.getSuccessful(name + " / " + age);
    }
    ​
    //output 这是由于返回的url中没有 age 这个key,所以报400错误,这是很常见的一种错误
    {
    "timestamp": "2020-09-26T07:22:51.449+00:00",
    "status": 400,
    "error": "Bad Request",
    "trace": "org.springframework.web.bind.MissingServletRequestParameterException: Required int parameter 'age' is not present
    "message": "Required int parameter 'age' is not present",
    "path": "/testRequestParam/two"
    }
    ​
    //此时可以通过给默认值来解决
    @GetMapping("/two")
    public Result two(@RequestParam(value = "name") String name,
    @RequestParam(value = "age" ,defaultValue = "1") int age) {
    ​
    System.out.println(name + " / " + age);
    return ResultGenerator.getSuccessful(name + " / " + age);
    }
    ​
    //output
    {
    "code": 200,
    "msg": "Amg / 1"
    }
     

    3.如果url后有多个key值,那么如此一个一个的接收就会显得很麻烦,而且方法参数也会很膨胀,一点都不优雅,其实我们还可以这样操作

    //这种写法就会使得方法参数很膨胀(不建议使用),其实我们只需要改造一下
    public Result three(@RequestParam(value = "name") String name,
    @RequestParam(value = "age") int age,
    @RequestParam(value = "gender") String gender,
    @RequestParam(value = "lover") String lover,
    @RequestParam(value = "weight") double weight ){
    ​
    }
    ​
    //用一个Map来接收所有的key,value值
    @GetMapping("three")
    public Result three(@RequestParam Map<String,Object> map){
    ​
    StringBuilder sb = new StringBuilder();
    map.forEach((key,value) -> {
    sb.append(key + " / " + value + "; ");
    });
    return ResultGenerator.getSuccessful(sb.toString());
    }
    ​
    //output
    {
    "code": 200,
    "msg": "name / Amg; age / 22; gender / 男; lover / guess; weight / guess; "
    }
     

二、@Requestbody和@ResponseBody

//首先构造一个对象,使用lombok插件给getter/setter和tostring方法
​
@Data
@ToString
public class User { private String name; private Integer age; private String gender;
}

​

1.接收前台返回来的json字符串,并且封装到User对象里面

(题外话:前台页面可以使用JSON.stringify函数把元素打成json串,指定内容格式为json,发送ajax请求到后台)

@GetMapping("/one")
@ResponseBody
public Result one(@RequestBody User user){
return ResultGenerator.getSuccessful(user.toString());
}
​
//预估会接收一个json串,然后又传回去(别纠结,只是做演示,正常会有逻辑操作)
 

发生了405错误,这是因为我们在错误的地方使用了POST请求,后台接收用了Get请求,没有对上,这也是非常常见的错误,修改方法也很简单

把后台的Get请求修改成Post请求(一般使用这种)

前台发送Get请求

//修改过后
​
//output
{
"code": 200,
"msg": "User(name=Amg, age=22, gender=男, motto=该吃吃,该喝喝,遇事别往心里搁)",
"data": null
}

至于@ResponseBody注解的演示,可是一直有在用,返回去的格式就是json格式串

三、@PathVariable

刚刚说了,该注解是接收url后面的变量的,使用起来也很方便,看一个小例子

//测试的接口:localhost:8080/testPathVariable/one/3024166
​
@GetMapping("/one/{id}")
public Result one(@PathVariable("id") String id){
return ResultGenerator.getSuccessful("接收回来的路径是:" + id);
}
​
//output
{
"code": 200,
"msg": "接收回来的路径是:3024166",
"data": null
}

以上注解都是日常工作中会用到的,今天抽了点时间做个小总结... 是时候打游戏去了(游戏不香嘛!!)

最后,感谢你的观看,如果觉得有收获的话,请帮忙点个赞

(关注公众号:码农Amg ,一位刚毕业的搬砖工,会不定期的分享工作中遇到的坑和学习小总结,时常还会分享沙雕日常,欢迎胖友们一起沟通交流)

一起努力学习,天天向上(emmm我们下期见吧,休息一下吧)

@RequestParam,@RequestBody,@ResponseBody,@PathVariable注解的一点小总结的更多相关文章

  1. @RequestMapping 和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法

    接下来讲解一下 @RequestMapping  和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法 @RequestMapping 为url映射路 ...

  2. SpringMVC传参注解@RequestParam,@RequestBody,@ResponseBody,@ModelAttribute

    参考文档:https://blog.csdn.net/walkerjong/article/details/7946109 https://www.cnblogs.com/daimajun/p/715 ...

  3. Spring @RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    背景 昨天一个人瞎倒腾spring boot,然后遇到了一点问题,所以把这个问题总结一下. 主要讲解request 数据到handler method 参数数据的绑定,所用到的注解和什么情形下使用. ...

  4. 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...

  5. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  6. 11.@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: handler method ...

  7. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  8. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    文章主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用. 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request ...

  9. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)

    引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...

随机推荐

  1. 在服务器上使用python-gym出现的显示问题

    参考链接: http://www.luyixian.cn/news_show_392045.aspx https://www.cnblogs.com/cenariusxz/p/12666938.htm ...

  2. DBeaver链接kerberos安全认证的Phoenix集群

    DBeaver链接kerberos安全认证的Phoenix集群 最近公司的CDH集群,启动了kerberos安全认证,所有的用户验证全部需要依赖kerberos来进行.之前的裸奔集群,总算有了一些安全 ...

  3. CSS动画实例:3D立方体

    CSS3支持3D转换,与3D转换有关的属性有: transform:向元素应用 2D或3D 转换. transform-origin:改变被转换元素的位置. transform-style:规定被嵌套 ...

  4. soso官方:基于相关排序的判断

    http://www.wocaoseo.com/thread-186-1-1.html 议程 概述 检索词 用户的信息需求 网页的自有信息 网页的附属信息 相关性的计算框架 概述 相关性的表象 检索词 ...

  5. @PostConstruct详解

    一.定义: @PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法. 从Java EE5规范开始,Ser ...

  6. 石子合并2(环形求最优解 区间dp)

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  7. Codehorses T-shirts (map+遍历)

    Codehorses has just hosted the second Codehorses Cup. This year, the same as the previous one, organ ...

  8. java初探(1)之登录终探

    上一章讲了表单验证,数据验证和加密.这一章,将研究服务器和数据库的交互过程. 后端服务器有两种主流的形式,SQL数据库和NOSQL数据库.其中MYSQL属于SQL数据库,REDIS属于非SQL数据库. ...

  9. vue 多环境打包

    https://cli.vuejs.org/zh/guide/mode-and-env.html#%E6%A8%A1%E5%BC%8F 模式 模式是 Vue CLI 项目中一个重要的概念.默认情况下, ...

  10. Oracle中select子句取值先于order by子句执行而导致rownum伪列未按预期取值导致的问题

    有这么一张表: create table hytb( id number(4,0) not null primary key, padid nvarchar2(20) not null, inputd ...