1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > requestbody接收不到参数_使用Spring MVC解析嵌套参数在三种 ContentType 下的绑定方式...

requestbody接收不到参数_使用Spring MVC解析嵌套参数在三种 ContentType 下的绑定方式...

时间:2021-07-06 21:39:00

相关推荐

requestbody接收不到参数_使用Spring MVC解析嵌套参数在三种 ContentType 下的绑定方式...

1.关于三种 Content-Type

multipart/form-data请求中既可以携带文件,又可以携带参数。其中参数以键值对的方式传递,参数之间、参数与文件之间以content-disposition分隔;

application/x-www-form-urlencoded只能上传参数,不能携带文件,参数通过?xxx=xxx&xxx=xxx的方式被组织在一起;

application/json只能上传参数,不能携带文件,参数不被特殊组织,保持原 JSON 字符串的形式

2.测试数据

这里采用嵌套数据如下:

{"username": "dailybird", "password": "dailybirdo", "ids": [1,2,3], "detail": {"gender": "male", "location": "Beijing", "ids": [4,5,6] }}

*与文件上传相关的参数后面会单独提到,这里先进行非文件参数提交的实验。

预期绑定的对象

public class User {private String username; private String password; private List ids; private Detail detail; public static class Detail {private String gender; private String location; private List ids; }}

3. 绑定方式

3.1 利用 @RequestBody 解析 application/json 的 POST请求

控制器代码如下:

@RequestMapping(value = "/application/json") public String applicationJson(@RequestBody User user) {log.info("{}", user.toString());return user.toString(); }

当使用 POST,并携带Content-Type: application/json头发送请求时,控制器能够完全解析嵌套的参数。

由于 @RequestBody 本身是调用HttpMessageConverter解析请求体中的数据,而 GET 方式的参数不会存在于请求体中,所以 @RequestBody 不能处理 GET 方式的请求。

3.2 利用 @RequestParam 接收 multipart/form-data 及 application/x-www-form-urlencoded 中的请求

控制器代码如下:

public String xWwwFormUrlencoded(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("ids")List ids, @RequestParam("detail") Detail detail) {log.info("{}, {}, {}, {}", username, password, ids, detail); return ""; }

其中 Detail 类为与之前 User 内部类等同的类。

3.2.1 application/x-www-form-urlencoded

这里我们借助 jquery 的相关函数进行测试:

Required List parameter 'ids' is not present

但我们确实已经发送了ids参数,为什么没有获取到呢?这一点我们放到之后再谈,先试一下 multipart/form-data 的方式。

3.2.2 multipart/form-data

当然,采用这一方式,我们会收到同样的提示:

Required List parameter 'ids' is not present

原因是multipart/form-data本来就只能发送文件和不嵌套的键值对解决办法就是把需要嵌套的json数据在发送前用JSON.stringify()方法转为json字符串,放入form表单中,就可以了。

在 Spring MVC 中,我们可以不书写 @RequestParam,直接使用与请求参数同名的变量进行接收( 或直接使用一个 POJO 对象 ),但该方式也存在着与以上相同的问题。

3.3 文件上传问题

最开始已经说过,若要上传文件,在上述三种 Content-Type 中,只能使用 multipart/form-data,在注意到 3.2 中所提到的问题后,我们便可以通过MultipartFile类型的属性来获取到文件参数了。

从 Laravel 过渡到 Spring Boot,确实感到了在控制器层面二者的差异( 当然在 DAO 层更是如此 ),以下给出一个列表,用以纪念自己踩的坑:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。