关于content-type与@RequestParam、@RequestBody的思考

背景

今天和同事联调单点登录时(我写前端,他写后端),发现使用PostAction传参后台接收不到,发现与使用的注解和content-type有关系,所以花了点时间进行了测试

问题

  • 前端使用PostAction(url,params).then(res =>{xxx})传参
  • 后端使用@PostMapping注解,参数列表不写注解,用String name接收
  • 后端打印,name为null

解决

  • 前端保持不变,后端改为用JavaBean接收,并加入@RequestBody注解

分析

在这里插入图片描述

  • 上图截图于:https://www.cnblogs.com/dreamcc/p/10752604.html
  • Content-Type的类型默认为application/x-www-form-urlencoded,但是axios默认的Content-Type为application/json,会以json字符串的形式发送到后端,所以String name肯定是接收不到的
  • 注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中https://blog.csdn.net/weixin_38004638/article/details/99655322),而QueryString可以理解为是url?后面的name=xxx&age=xx
  • 注解@RequestBody是将post请求中内容转为一个整体对象

@RequestBody的解析有两个条件:
1.POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组);
2.@RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean;所以Integer类型不能作为@RequestBody注解的参数类型
https://blog.csdn.net/qfikh/article/details/88553603

  • 所以这里的Content-Type为application/json,且使用post方式传参,就必须使用@RequestBody JavaBean/Map/JsonObjct来接收;
  • 之前失败是因为,传过来了json字符串,但是使用String name接收
  • 现在成功是因为,传过来了json字符串,使用@RequestBody和JavaBean接收,@RequestBody会将json字符串转为一个整体的对象

测试

自己使用Postman跑之后,得出上述图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值