预备知识:HTTP中的Content-Type
在SpringMVC中接收数组是一个经常用到的功能,今天我们来介绍一下如何实现。在SpringMVC中接收数组有接收值数组和对象数组2种。
如果你对HTTP协议中的Content-Type没有一个清晰的认识肯定会头脑晕晕的。Content-Type表示请求时发送的数据的类型,Content-Type的值有很多,我们这里需要区分的是application/json和application/x-www-form-urlencoded两种类型。application/json表示请求参数的类型是json类型的,application/x-www-form-urlencoded就是我们最常用的表单。
要想正确的传输数组首先需要把Content-Type设置正确哦。
application/x-www-form-urlencoded传输值数组
今天的测试我们用postman作为客户端来进行。
我们用postman来模拟表单提交,先设置Content-Type为application/x-www-form-urlencoded,参数设置3个userIds,其值分别为u1、u2和u3,这样就表示我们上传一个name为userIds的数组,它的值为u1、u2和u3。再设置一个who,其值为tom。客户端配置如下图:
Content-Type为application/x-www-form-urlencoded服务器端我们用SpringMVC接收参数,如下图:
@RequestParam接收数组这样就配置完了。正如你所看到的,我们在SpringMVC中使用@RequestParam注解来接收参数,并设置了接收的key为userIds。另外我们通过@RequestMapping注解的method属性设置了这个请求对应的http方法为post,通过consumes属性设置了这个方法用于处理Content-Type为application/x-www-form-urlencoded的请求。最后通过@ResponseBody将方法的返回值直接作为响应返回。最后通过执行结果可以看到参数的接收和处理都是能够正常完成的:
响应结果好啦,现在我们已经使用application/x-www-form-urlencoded进行了一次数组的传输和处理,不过这种方式只能用于传输值数组,如果是对象数组的话我们需要将Content-Type更改为application/json进行传输。
application/json传输值数组
先来看一下如何使用application/json传输值数组。
使用postman设置Content-Type为application/json,再设置body的类型为raw,然后在编辑区写上我们要传输的数组格式的数据,如图:
设置Content-Type为application/json 编辑数组在服务端我们的设置如下:
@RequestBody注解接收图中我们通过@RequestBody注解而不是@RequestParam注解来配置。
@RequestParam用来接收Content-Type为application/x-www-form-urlencoded和get请求的参数@RequestBody用来接收Content-Type为application/x-www-form-urlencoded以外的其他类型的参数
另外我们还通过consumes和produces属性设置了我们这个方法处理和返回的Content-Type均为application/json。这里大家可能看到了我们在body里面直接传输数组而没有name,那么我们在SpringMVC的方法中也直接定义一个数组或者List就可以了。下图就是一个List:
List接收数组好啦,这里的关键就是@RequestBody和方法参数。下面我们来看一下如何使用application/json传输对象数组。
application/json传输对象数组
理解了application/json怎么传输值数组后再来看application/json怎么传输对象数组就简单很多了,如下图设置json格式的参数:
对象数组同样的在SpringMVC端,使用@RequestBody接收对象数组,这里我们使用的是User对象,User对象中有name和age两个属性。
接收对象数组 User类这样就能完整的接收和处理对象数组了,现在大家是不是发现很简单啦,下面我们简单总结一下吧。
总结
当Content-Type为application/x-www-form-urlencoded时,只能传输值数组,没办法传输对象数组。当Content-Type为application/json时,既能传输值数组,也能传输对象数组,但是在SpringMVC中要使用@RequestBody来接收,并且接收的数据类型要和传入的数据类型保持一致。另外提醒一点,@RequestBody注解不可省略哦。
大家在开发过程中需要设置对Content-Type才能避免很多问题,这一点很重要哦。
网友评论