前情提要:
最近在做项目时,发行突然改了需求,原来前端提交数据的时候Content-Type
是application/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);