Spring @RequestBody和@RequestParam的请求方式get和post关系

  首先Spring的微服务是通过URL进行交互的。在http的请求中post和get的请求方式所带的参数对于Spring的@Controller下的注解有一些不同。

一、URL和URI

  先来理解一下什么是URL和URI。
在这里插入图片描述
  URI可以分为URL,URN或同时具备locators 和names特性的一个东西。URN作用就好像一个人的名字,URL就像一个人的地址。换句话说:URN确定了东西的身份,URL提供了找到它的方式。
  我们常常说访问URL->[www.baidu.com],其实这是不严谨的说法,其实这是个URI,真正的URL是[http://www.baidu.com]

二、Get与Post区别

  Get和Post都是Http协议的组件,所以底层都是使用tcp链接。Get的请求方式是将http的header和data一并发往服务端,也就是一条tcp数据包发送,这就会有两个问题:

  • 数据量有限,依赖于Tcp负载能力,所以携带的数据量很大的情况下,容易造成重发。
  • 所有的携带的数据只能接受转化成ASCII字符。

  但是Post不一样,post使用两步走,先发送http的header,然后再传输data。数据类型也不受限制。而且数据隐秘性比较好。

三、Get方式参数获取

  get请求方式参数是拼接在url后,所以限制了可以发送的长度。Get不支持使用http Body获取参数,他只支持params,也就是URL拼接参数。

1、默认方式
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(Integer id){
}

  默认情况下会从Param(就是URL后面的拼接参数)获取名字是id的项,自动转化成Integer类型,其他的类型也是类似。

2、使用@RequestParam
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){
}
3、使用HttpServletRequest
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(HttpServletRequest request){
    Integer id = Integer.parseInt(request.getParameter("id"));
    if (id.intValue() == 0) {
        return null;
    }
}

  这个方法是获取整个URL的信息,然后手动获取和分离参数,和类型转化。这个里面带的内容很多,不仅Param还有Header,Cookies等。

四、Post方式参数获取

  post可以传递参数可以大致分成两种,一种是表单:在sevlet实现中mutipart/form-data和application/x-www-form-urlencoded会被特殊处理,请求参数将被放置于request.paramter,解析成map。第二种,已application/json,参数是存放在json中的,参数必须要用@RequestBody才能解析出来。

1、使用@RequestBody
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestBody Integer id){
}

  这种方式传递方式必须使用Content-Type=application/json。这个不仅可以指定id等具体对象,也可以用Map,直接把所有对象拿到手,然后再(Integer) map.get(“id”)转化。

2、使用@RequestParam
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){
}

  这种方式只用在Content-Type=mutipart/form-data和Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。
  如果是这种方式,URL后面拼接Param,也就是类似Get请求的方式,这样的post请求,@RequestParam是可以用的。能够获取后面的参数
  有一个有趣的现象,如果Content-Type=mutipart/form-data,Body中加入参数和URL后面拼接参数一起做Post请求,都可以被加载到Param中,如果是同名的,只取用form-data中的。
  如果Content-Type=application/x-www-form-urlencoded和URL拼接的一起,如果是String类型,则两个值会被拼接,其他类型取的是URL拼接的参数。

2、通用HttpServletRequest

  和Get方式一样,这是个通用的方式。这个也可以和URL拼接的一起搭,但是没有RequestParam的String类型值被拼接问题,优先级 form-data高于URL拼接高于x-www-form-urlencoded。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值