url上拼接数据的两种格式
第一种:url?name=“小小”&age=12,application/x-www-form-urlencoded*格式的这个是form-data默认的enctype属性类型值,数据url?name=“小小”&age=12,这样的格式,在ajax请求里面就是用param来标识,后端用@RequestParam接受,这也是键值对格式的数据,前端变量名也传了
第二种:直接传值,不要变量名在url上加斜杠再加要传的值,不用传变量名,不是键值对格式的,不符合restful风格
例如:
@RequestMapping("/getProject/123")
后端用@PathVariable(“getProject/{id}”)
public string project(@PathVariable(value=""id) Integer id){
System.out.printf(id);
}
三种数据格式:
Get和Post都是Http协议的组件,所以底层都是使用tcp链接。Get的请求方式是将http的header和data一并发往服务端,也就是一条tcp数据包发送,这就会有两个问题:
数据量有限,依赖于Tcp负载能力,所以携带的数据量很大的情况下,容易造成重发。
所有的携带的数据只能接受转化成ASCII字符。
但是Post不一样,post使用两步走,先发送http的header,然后再传输data。数据类型也不受限制。而且数据隐秘性比较好。
post可以传递参数可以大致分成两种,一种是表单(form-data):在sevlet实现中mutipart/form-data和application/x-www-form-urlencoded*(这个是form-data默认的enctype属性类型值,数据url?name=“小小”&age=12,这样的格式,在ajax请求里面就是用param来标识,@RquestParam就是用来接受这种数据格式的)会被特殊处理,请求参数将被放置于request.paramter,解析成map。第二种,已application/json,参数是存放在json中的,参数必须要用@RequestBody才能解析出来。
form-data格式一般是用来进行文件上传的。使用表单上传文件时,必须让
表单的 enctype 等于 multipart/form-data,因为该值默认值为application/x-www-form-urlencoded
RequestParam这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,这里的@RequestParam(“iv”)代表传参名称是iv(name=”iv”),且是必填。如果不是必填,可以改成如下形式:sevlet将Body中的key-value转成Param。
总结起来,后端方法参数,是一个实体类可以用form-data表单application/json,但是有文件一起和参数一起就只能用form-data,@RequestParam后面只加基本类型,不加封装类
form-data数据可能会加入到params中
在发get请求的时候如果在formdata里面加了文件,也可以发请求,并且成功,但是文件是接收不到的,但是这些form-data参数不追加到url,只有params参数会被追加到url,并不是说get请求就一定追加到url
form-data用get请求后端也能接受,但是文件是不能接收到的,如图
有一个有趣的现象,如果Content-Type=mutipart/form-data,Body中加入参数并且params里面也加了参数一起发过去,并且出现,params参数和for-data参数出现重名,URL后面也就会拼接参数一起,分别发Post请求和post请求,重名的参数只取params里面的
看下图;
post请求输出:
把postman的请求换成get请求,其他的不变
看输出:
如果Content-Type=application/x-www-form-urlencoded和URL拼接的一起,如果是String类型,则两个值会被拼接,其他类型取的是URL拼接的参数。
RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的 数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。,没有@RequestBody修饰直接写实体类作为参数,后台是接收不到Json字符串的,只能通过参数form-data里面的param接受
postman测试的步骤如下图
@RequestMapping(value = "/body", method = RequestMethod.POST)
public String body(@RequestBody myDto dto){
System.out.println(dto.getName()+dto.getAge());
return dto.getName();
}
@RequestMapping("/givePojo")
public String pojo(myDto dto){
System.out.println(dto.getName()+dto.getAge());
return dto.getName();
}
没有@RequestBody修饰没有返回值
json对象和formData对象互转
get请求用application/x-www-form-urlencoded编码格式传数据后端用@RequestParam接受时会报错,不加@RequestParam也接受不到,因为编码格式不对,后端无法接受,加了@RequestParam时没有匹配上数据时会报错。。
加上application/x-www-form-urlencoded本来就是post传输数据的默认的编码格式。
服务器知道参数用符号&间隔,如果参数值中需要&,则必须对其进行编码。编码格式就是application/x-www-form-urlencoded(将键值对的参数用&连接起来,如果有空格,将空格转换为+加号;有特殊符号,将特殊符号转换为ASCII HEX值