一、Get与Post区别   

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

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

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

作为后端,我们经常需要和前端进行数据之间的交互,而我们从前端获取的方式主要有下面几种

  • 路径中的数据,例如localhost:/user/2,这时我们需要获得路径上的数字2
  • 存放到url头里的参数例如localhost:/user?name=zhang
  • 存放到body里的数据,使用普通编码格式(下面详细解释)我们可以通过@requestParam获取
  • 存放到body里的json格式数据,使用application/json格式,我们可以使用@requestBody获取

二、Get方式参数获取

使用@RequestParam

@RequestMapping(value="/getUserInfo")
public User getUserInfo(@RequestParam(value= "id") String id  ){
}

使用HttpServletRequest

@RequestMapping(value = "/getUserInfo")
public User getUserInfo(HttpServletRequest request){
Integer id = Integer.parseInt(request.getParameter("id"));
if (id.intValue() == 0) {
return null;
}

三、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这种情况下才能使用,servlet将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拼接的参数。

  1. @RequestBody只能使用一次,因为读取json的流只能使用一次,一个方法出现两个注解@RequestBody的结果是报错
  2. 实体类无需加@RequestParam, map必须加@RequestParam, 其他字符串等加上@RequestParam必须传值,你也可以加入@RequestParam(value=“mh”, required = false),这样就和不加注解是一样的
  3. url?userName=zh&userName=an即一个url含有多个同名的参数,传到后台是zh,an可以使用数组或者list获取