使用@ResquetBody和@RequestParam的注意事项

1.前言

    如今前后端分离之后,大多采用json格式的数据进行交互,Java后台一般也就采用发现用@ResquetBody和@RequestParam两个注解进行接收参数。

    常规做法是:

  •     @ResquetBody用来接收一个复杂的包装类型,比如:
@RequestBody AuthApplyDto authDto
@Data
public class AuthApplyDto {
    private int id;
    private String status="";
    private String userId="";
    ...
}
  •     @ResquetParam用于接收基本类型或者基本类型及String对象。当然,如果请求参数不复杂,使用多个@ResquetParam也可达到@ResquetBody同样的效果(如果参数不多的时候)。

    但是,很有可能你会遇到下面的情况:

"Required String parameter 'userid' is not present"

此时,你需要重新审视这两个注解的使用场景了。

2. @ResquetParam与@ResquetBody的测试验证

    场景一:使用@ResquetParam注解,测试工具:postman。

    后台参数接收如下:

@RequestParam(name="userid") String userId,
 @RequestParam(name="resourceid") String resourceId) 
  • 情况一:get方式请求,请求参数如下:
{
"userid":1,
"resourceid":"18"
}

    测试结果:后台可以接收。

 

  • 情况二:post方式请求,json序列化传递,请求参数同上。后台报错如下:

4a15ce26b7283503c82c4ab2ac3d4fa3392.jpg

    呵呵,这个几个意思,明明传递了userid,却提示我没有传,不科学啊!!!仔细一想,问题肯定出在后台对参数的解析上。

 

  • 情况三:同时注意到,如果采用form-data的方式则可以成功请求。

9d12f928ff4f2bdd51d9d64457399081554.jpg

  • 情况四:如果采用x-www-form-urlencoded的方式也可以成功请求

ffc6577085578d48e6c1c16e7fbb336fadc.jpg

    

        那为什么同样是post请求,json格式的数据却无法解析。这是因为第三种和第四种都是以表单数据提交,content-Type并不是application/json。更多详情参见:四种常见的 POST 提交数据方式

        也就是说Content-Type = application/x-www-form-urlencoded(或者 multipart/form-data) 的编码方式,二者是表单请求,可以用@RequestParam一个一个获取参数。而 Content-Type = application/json 的时候参数获取不到。并且会报错:

- Required String parameter ‘xx’ is not present

        那对于application/json的编码,应该怎么接收呢,答案则是@RequestBody。此注解能够做json格式的解码和编码。

 

    场景二:使用@ResquetBody注解,测试工具:postman。

    后台参数接收:

@RequestBody AuthApplyDto authDto
  • 情况一:json格式传递,post请求,测试结果成功。

9050053b0c8896f415c2d6ebc5e12b5609f.jpg

 

  • 情况二:如果使用@RequestBody接收参数,使用表单格式post请求,又会发生什么呢?答案是不支持。

f82f739ef8f2c42ef2de2093b7a690a8dff.jpg

 

  • 情况三:如果,请求方式为get,后台参数接收@RequestBody ,如下格式,会发生什么呢??答案是肯定的。

    测试结果如下:

c86a52c2c4593a34775f4b74a1a4e12ef01.jpg

 

3. 干货总结:

    对于@RequestParam注解,完全支持get请求,对于post请求只能接收表单格式的数据,对于json序列化的数据不支持。
    对于@RequestBody注解,完全支持get请求,对于post请求只能接收json序列化的数据,不支持表单格式的数据。

    疑问,这两个注解底层如何做适配解析的?

 

4. 最后做个小记录

    如果请求数据为数组,比如:

{
    "ids":[1,2]
}

后台需要做如下包装,便可接收。

@RequestBody DeleteIds ids,

@Data
    public class DeleteIds {
        private Set<Integer> ids;
    }

转载于:https://my.oschina.net/woniuyi/blog/3099802

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值