@RequestBody与@RequestParam、数据绑定与fastjson

前情提要:
最近在做项目时,发行突然改了需求,原来前端提交数据的时候Content-Typeapplication/json,现在改为了 application/x-www-form-urlencoded

这波操作搞得我是措不及防,我一个小白,咱也没整过啊,这都是什么玩意。后来在老大的“悉心”教导下也算摸清了一些门路。

接下来就按照我的思路写一篇笔记,以防以后再被改需求。

一、@RequestBody与@RequestParam

1.1 @RequestParam

  • @RequestParam接收的参数是来自HTTP请求体或请求url的QueryString
  • 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。
  • @RequestParam可以接受简单类型的属性,也可以接受对象类型。
  • @RequestParam也可用于GET、POST、DELETE等类型的请求。

1.2 @RequestBody

  • 处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据
  • 注解@RequestBody接收的参数是来自requestBody中,即请求体。
  • 一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据(application/json时候可用,form-data、x-www-form-urlencoded时候不可用)。
  • @RequestBody可用于POST、DELETE等类型的请求。
@RequestParam Map map

application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉
@RequestParam String waterEleId,@RequestParam String enterpriseName

application/json时候,json字符串部分不可用,url中的?后面添加参数即可用
form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序
(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉
@RequestParam Object object

不管application/json、form-data、x-www-form-urlencoded都不可用

既不是@RequestBody也不是@RequestParam,没有指定参数哪种接收方式

Map map
Object object

application/json时候:json字符串部分不可用,url中的?后面添加参数不可用。
因为没有指定,它也不知道到底是用json字符串部分还是?后面添加参数部分,所以干脆都不可以用
form-data、x-www-form-urlencoded时都不可用
 
HttpServletRequest request

application/json不可用
form-data、x-www-form-urlencoded时可用

在GET请求中,因为没有HttpEntity,所以@RequestBody并不适用

二、总结

在GET请求中,不能使用@RequestBody。
在POST请求,可以使用@RequestBody@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。

三、数据绑定

关于数据绑定,我看了n篇博客,网上资料挺多的就不细讲了。

对于我而言,我就把它简单的理解为了 将前端传入的参数,不论是JSON、XML格式还是application/x-www-form-urlencoded的表格对于的key-value格式,然后由后端的controller接收该参数,并绑定为String、Integer、List和Map集合、自定义对象,然后进行操作

四、利用FastJson将前端POST提交 application/x-www-form-urlencoded中的数据转化为自定义对象

由于在自定义的对象中某个属性前端传进来的是JSON格式,但是数据绑定的时候只能将其绑定字符串,因此,就需要在定义中入参后在转化为JSON或自定义对象

使用fastjson前要导入依赖包,建议使用最新版本点击进入fastjson的maven仓库网址

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.75</version>
</dependency>

1、如果自定义对象是数组的话,引入fastjson包 转化为json数组

自定义对象 jsonArray = JSONObject.parseArray(params.getItem(),自定义对象.class);

2、当自定义类型是String,Map等类型或自定义类型时,可使用

T t = JSONObject.parseObject(data, T);

3、调用其他后端服务时,传入的参数要符合json格式,这时就可以使用jsonStr来当做参数

String jsonStr = JSONObject.toJSONString(data);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值