灵活运用的@RequestParam和@RequestBody

最近在编写项目的过程中,老出现前后端传递参数格式不一致、不统一的问题,对于一个已经快工作一年的Java程序员来说,实属不合格,所以我就下来好好研究了一下@RequestParam和@RequestBody的区别,避免大家遭遇同等错误;

一 @RequestParam注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {

	/**
	 * 参数名称(和value同等意思)
	 */
	@AliasFor("name")
	String value() default "";

	/**
	 * 参数名称 (和name同等意思)
	 */
	@AliasFor("value")
	String name() default "";

	/**
	 * 是否必选(默认必选)
	 */
	boolean required() default true;

	/**
	 * 参数默认值
	 */
	String defaultValue() default ValueConstants.DEFAULT_NONE;

}

(1)@RequestParam总体上来说,该注解类拥有三个参数:

  a)value、name 属性都标识请求参数名(必须配置);

  b)required:参数是否必传,默认为 true,可以设置为非必传 false;(如果设置了必传或默认,请求未传递参数,将会抛出异常);

  c)defaultValue:参数默认值,如果设置了该值,required 将会自动设置为 false;

(2)@RequestParam注解获取的参数放在请求哪?

  a)get请求的 headers 中没有 content-type 这个字段,使用 form-data 表单形式携带参数请求;

  b)Spring中的@RequestParam注解接收的参数是来自requestHeader中,即请求头,也就是url中,格式为:http://localhost:8080?name=yc&age=23,由于 url 长度有限制,所以参数需要限制数量和值得长度;

(3)如何使用:

  使用一:利用Postman工具,使用form-data提交Get请求

  

  执行代码:

@RequestMapping(value = "/test", method = RequestMethod.GET)
    public void test(@RequestParam("id") Integer id,
                     @RequestParam("name") String name,
                     @RequestParam("age") Integer age) {
        log.info("id = {}, name = {}, age = {}", id, name, age);
    }

  结果:

id = 1, name = yc, age = 23

  使用二:不使用@RequestParam注解直接进行对象属性赋值(不推荐使用,容易和@ReuqestBody混淆)

  代码执行:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

@RequestMapping(value = "/test", method = RequestMethod.GET)
    public void test(User user) {
        log.info("id = {}, name = {}, age = {}", user.getId(), user.getName(), user.getAge());
    }

  结果:

id = 1, name = yc, age = 23

(4)使用场景:

  a)请求是为了查找资源,获取服务器数据;

  b)请求结果无持续性的副作用,例如:不会对数据库进行添加、修改、删除操作;

  c)传入的参数不会太长,因为Get请求可能会产生很长的URL,或许会超过某些浏览器与服务器对URL的长度限制,导致请求失败;

二、@RequestBody注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {

	/**
	 * 默认参数必传
	 */
	boolean required() default true;

}

(1)@RequestBody注解只拥有一个参数:

  required 默认为 true,即对象中的属性必须有一个要传,否则会抛出异常:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing

(2)@RequestBody注解获取的参数在请求哪?

  a)post请求的requestHeaders请求头中有content-type字段,一般用来处理:applicatin/json格式的参数;

  b)Spring中的@RequestBody注解是用来接收请求体中的参数数据,即requestBody请求体中,故不受参数数据长度的限制;

(3)如何使用?

  使用Postman工具发送json格式的数据:

  

  执行代码:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;

}

@RequestMapping(value = "/test", method = RequestMethod.POST)
    public void test(@RequestBody User user) {
        log.info("id = {}, name = {}, age = {}", user.getId(), user.getName(), user.getAge());
    }

  结果:

id = 1, name = yc, age = 23

(4)使用场景:

  a)请求的结果有持续性作用,例如:对数据库添加、更新、删除操作;

  b)若使用Get请求,表单参数过长;

  c)要传送的数据不是采用7位的ASCII编码;

测试三:使用Post请求,@RequestParam也可以接收参数(这种方式不知道为啥也可以这样用,但是我不这样用,害怕混淆)

  

  执行代码:

    @PostMapping(value = "/test")
    public void test(@RequestParam("id") Integer id,
                     @RequestParam("name") String name,
                     @RequestParam("age") Integer age) {
        log.info("id = {}, name = {}, age = {}", id, name, age);
    }

  结果:

id = 1, name = yc, age = 12

  每天进步一点点,开行!  

  

原文地址:https://www.cnblogs.com/blogtech/p/11172168.html

时间: 2024-08-30 16:40:38

灵活运用的@RequestParam和@RequestBody的相关文章

spring boot的@RequestParam和@RequestBody的区别

尊重原创:https://blog.csdn.net/u013306545/article/details/79071683 一.问题描述 由于项目是前后端分离,因此后台使用的是spring boot,做成微服务,只暴露接口.接口设计风格为restful的风格,在get请求下,后台接收参数的注解为RequestBody时会报错:在post请求下,后台接收参数的注解为RequestParam时也会报错. 二.问题原因 由于spring的RequestParam注解接收的参数是来自于requestH

@RequestParam、@RequestBody和@ModelAttribute区别

一.@RequestParamGET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上1. @RequestParam(org.springframework.web.bind.annotation.RequestParam)用于将指定的请求参数赋值给方法中的形参.例:(1) get请求: url请求:http://localhost:8080/WxProgram/findAllBookByTag?tagId=1&pageIndex=3 userTest.jsp &l

@RequestParam和@RequestBody的区别

@RequestBody是用来接收 application/json需要解析json字符串,然后通过json获取参数,这里用到是fastjson public CommonReturnType login(@RequestBody String jsonStr) { JSONObject requestJson = JSON.parseObject(jsonStr); String telphone=(String)requestJson.get("telphone"); String

post传参params与body的区别(@RequestParam和@RequestBody的区别)

1.axios post请求  Content-Type默认为 application/x-www-form-urlencoded,我们传递参数的时,params里面的参数(简单的对象,通过 "{}" 或者 "new Object" 创建的)会被以&拼接的方式拼接到请求地址的后面,data里面的参数(简单的对象,通过 "{}" 或者 "new Object" 创建的)会以Form Data的形式存在,但是Form Da

springMVC 注解版

关于Spring MVC注解 @Transactional 事务标签 @InitBinder 标签 分类: Java开发 源代码分享2012-06-14 10:59 7721人阅读 评论(2) 收藏 举报 springmvcjavaemailpathstring 主要用到了spring-aop-2.5.6.jar的AOP支持包! 之前我们在AccountService中加入了注解@Transactional标签,但是要想要真正发挥事务作用,还需要一些配置. 主要需要调整dao.xml文件 dao

spring常用注解使用讲解

spring常用注解使用讲解 本文讲述spring的几个常用的注解 @RequestMapping @RequestParam @ResponseBody @RequestBody @Autowired 一.@RequestMapping  RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她分成三类进行说明. 1. value, method: v

Spring MVC之@RequestMapping 详解

引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessage

Spring + Mybatis 企业应用实战 第3章 Sping MVC的常用注解

注解(annotation) @Controller @Controller是扩展的@Component的,可以说基本一样,就是作为一种标志. @RequestMapping value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明): method:  指定请求的method类型, GET.POST.PUT.DELETE等: consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text

@RequestMapping 用法详解之地址映射

前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessageC