常用的前后台交互有以下几种方式:
- 直接使用参数获取;
- 使用@PathVariable注解;
- 使用@RequestParam注解;
- 使用@RequestBody注解。
RequestBody
- 不能接受get , 不能接受form-data和 x-www-form-urlencoded, 但是好像postman也能用get?
- 只能接受json , 主要接受对象类型,可以接受简单类型的属性(这里只能接受string 当做字符串, 其他类型会报错)。
RequestParam
- 接受get、 post , 不接受json,可以接受简单类型的属性,不可以接受对象类型!
- get请求不能使用表单提交获取, 只能用url字符串拼接, post请求才可以接受表单form-data和-form-urlencoded
@PathVariable
- 如果要获取某个id下此条问题答案的查询次数的话,则后台就需要动态获取参数,其注解@PathVariable
- 格式@RequestMapping("/testPathVariable/{s}") , String s
- get ,post都可以
从content-type方面总结:
① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。这两种方式没有json字符串部分。
② application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。
所以: @Requestparam 和@RequestBody不能同时使用,这是错误的。根据HTTP协议,并没有说post请求不能带URL参数,经验证往一个带有参数的URL发送post请求也是可以成功的。
其他:
- @RequestParam不能接受对象
- 直接使用参数获取可以接受form-data和x-www-form-urlencoded的对象,还能接受raw 的json数据,但是只能是对象!!!单个参数里面写json 不行除了string!@RequestBody也不能单个参数写json除了string
- 直接使用参数获取可以传参为空
- @RequestParam, @PathVariable,@RequestBody一定要传参值
- vue的axios默认会自动封装成json数据
Postman:
Header: 根据发送的类型对应上conten-type,还有一些token也可以放在头header
Authorization: 身份验证,主要用来填写用户名密码,以及一些验签字段;
form-data: 对应信息头-multipart/form-data,它将表单数据处理为一条消息,以标签为单元用分隔符分开。既可以上传键值对,也可以上传文件(当上传字段是文件时,会有Content-Type来说明文件类型);
x-www-form-urlencoded: 对应信息头-application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如name=zhangsan;
multipart/form-data与x-www-form-urlencoded区别:
- multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;
- x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。
raw: 可以上传任意类型的文本,比如text、json、xml等;要传参json必须选择json格式,不然接受不到或者有问题
binary: 对应信息头-Content-Type:application/octet-stream,只能上传二进制文件,且没有键值对,一次只能上传一个文件;