前言: 因为总是需要使用不同的参数传递方式,所以特地来总结一下SpringBoot中常用的参数的绑定方式,给有需要的朋友查阅。
注意:虽然Restful风格很流行,但是大部分还是主要是GET和POST的内容,所以这里只是列举GET和POST请求为例。 而且,无论怎么样的花样传参,它都是符合上面这个报文结构的!正所谓:万变不离其宗嘛!
注意:我这里是示例形式是:代码+Postman测试截图+Fiddler抓包截图。
/**
* GET 方式传递参数 单个参数
* */
@GetMapping("/get01")
public String get01(String comment) {
return comment == null ? "no parameter" : comment;
}
使用@RequestParam注解,请求必须携带参数,否则就会报错,否则就是:错误码400 Bad Request
@GetMapping("/get02")
public String get02(@RequestParam("comment") String comment) {
return comment;
}
如果参数不添加 @RequestParam 注解,那么这个参数即可不传递,而使用了注解的话,默认是必须传递参数的,当然了也可以配置为false。但是,我倾向于还是显示使用注解,这样比较清晰,也可配置,更加灵活。
/**
* GET 方式传递参数 多个参数
* */
@GetMapping("/get03")
public String get03(@RequestParam("id") String id,
@RequestParam("name") String name,
@RequestParam("comment") String comment) {
System.out.println(id + " " + name + " " + comment);
return id + " " + name + " " + comment;
}
/**
* 使用对象对参数进行封装,这样在多个参数时,优势很明显。
* 但是这里无法使用 @RequestParam注解,否则会出错。
* */
@GetMapping("/get04")
public Comment get04(Comment comment) {
if (Objects.isNull(comment)) {
return null; // 需要对 null 值进行处理
}
System.out.println(comment);
return comment;
}
/**
* 使用对象封装参数要求必须具有一个对象,所以可以使用 Map 来封装,这样可以减少对象的数
* 量。
* * */
@GetMapping("/get05")
public Map<String, String> get05(@RequestParam Map<String, String> map) {
map.forEach((k, v) -> {
System.out.println(k + " --> " + v);
});
System.out.println(map.size());
return map;
}
/**
* 参数和路径结合,适用于单个参数的情况
* */
@GetMapping("/get06/{id}")
public Comment getById(@PathVariable("id") String id) {
Comment comment = new Comment();
comment.setId(id);
comment.setName("Alfred");
comment.setComment("I love you yesterday and today!");
return comment;
}
请求直接写在路径上,成为路径的一部分
前面都是文本数据,现在我们尝试来获取二进制数据,注意这个方法需要下面的上传文件方法向上传文件,或者你自己在文件夹下面放入一个文件。
/**
* 返回值为二进制
* 其实这里可以使用 Files.readAllBytes()这个方法,这样就简单了。这里我就不改了,我习惯了使用这种
* 循环读取的方式,不过确实有点繁琐了。
* */
@GetMapping("/get07/{name}")
public void getFile(@PathVariable("name") String name, HttpServletResponse response) {
try (OutputStream out = new BufferedOutputStream(response.getOutputStream())) {
try (InputStream in = new BufferedInputStream(new FileInputStream(new File(baseDir, name)))) {
int len = 0;
byte[] data = new byte[4*1024];
while ((len = in.read(data)) != -1) {
out.write(data, 0, len);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* POST方式传递参数
* @return
* */
@PostMapping("/post01")
public String post01(@RequestParam("id") String id,
@RequestParam("name") String name,
@RequestParam("comment") String comment) {
System.out.println(id + " " + name + " " + comment);
return id + " " + name + " " + comment;
}
02.键值对映射Map
@PostMapping("/post02")
public Map<String, String> post02(@RequestParam Map<String, String> map) {
map.forEach((k, v) -> {
System.out.println(k + " --> " + v);
});
return map;
}
03.传递json数据映射对象
@PostMapping("/post03")
public Comment post03(@RequestBody Comment comment) {
System.out.println(comment);
return comment;
}
请求参数形式为json字符串,并且选择Content-Type选择 raw,不能选择其它形式的原因的,form-data和x-www-form-urlencoded都会改变请求参数
04.json数组映射对象数组
/**
* 传递对象数组
* */
@PostMapping("/post04")
public Comment[] post04(@RequestBody Comment[] comments) {
return comments;
}
@PostMapping("/post05")
public List<Comment> post05(@RequestBody List<Comment> commentList) {
return commentList;
}
/**
* 传递二进制数据
* */
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
try {
file.transferTo(new File(baseDir, fileName)); // 对于 SpringBoot 中使用路径还是懵逼!
return "success";
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "Fail";
}
/**
* 表单数据,含文本和二进制
* */
@PostMapping("/submitInfo01")
public String submitInfo(@RequestParam("id") String id,
@RequestParam("name") String name,
@RequestParam("file") MultipartFile file) {
System.out.println("id: " + id);
System.out.println("name: " + name);
System.out.println("fileName: " + file != null ? file.getOriginalFilename() : "null");
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
try {
file.transferTo(new File(baseDir, fileName));
return "success";
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "Fail";
}
上面那样如果表单项比较多的话,映射还是比较麻烦的,可以选择创建一个对象封装所有的属性,这样处理起来就会更加方便,并且也是面向对象思想的应用。
/**
* 表单数据,含文本和二进制 进一步封装!
* */
@PostMapping("/submitInfo02")
public String submitInfo02(User user) {
MultipartFile file = user.getFile();
System.out.println("id: " + user.getId());
System.out.println("name: " + user.getName());
System.out.println("fileName: " + user != null ? file.getOriginalFilename() : "null");
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
try {
file.transferTo(new File(baseDir, fileName));
return "success";
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "Fail";
}
/**
* POST以二进制形式传递文件,通常的web表单是做不到的,但是ajax2.0以后是支持的,我们来尝试一下。
* 注意它和 Multipart的区别,Multipart实际上不只包含文件本身的数据,还有文件的其它的信息,例如刚才获取的文件名。
* 但是如果以二进制的形式传递,它就是完全的文件数据流,不包含任何其它信息,只有文件本身的二进制数据流。
*
* 使用这种形式,只能传输单个文件,无法传输多个文件,因为它只是文件本身的二进制数据,如果是多个的话,
* 那么谁也别想从一个连续的二进制流中把图片切分出来了。
* */
@PostMapping("/binaryFile")
public String binaryFile(@RequestBody byte[] fileData) {
try {
Files.write(Paths.get(baseDir, UUID.randomUUID().toString() + ".jpg"), fileData);
return "success";
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
}
SpringBoot前后端参数传递方式总结相关推荐
- B站云E办Vue+SpringBoot前后端分离项目——MVC三层架构搭建后台项目
本项目来源B站云E办,笔记整理了项目搭建的过程和涉及的知识点.对于学习来说,不是复制粘贴代码即可,要知其然知其所以然.希望我的笔记能为大家提供思路,也欢迎各位伙伴的指正. 项目前端学习笔记目录 B站云 ...
- Android+SpringBoot前后端分离实现登录注册
Android+SpringBoot前后端分离实现登录注册 一.登录 1.界面设计 2.Android端 (1)布局文件(activity_login) (2)java文件(LoginActivity ...
- springboot前后端分离后权限原理浅谈
1. 需求描述 最近在梳理springboot前后端分离后的权限管理问题.前段时间,已经把shiro的实现和spring security 的实现进行了初步的了解.如果深入细节,一个篇幅怕是不够.本文 ...
- SpringBoot后台管理+Uniapp(混合APP)前端 之 酒店住宿+景点下单管理系统(SpringBoot前后端分离)
酒店住宿+景点下单管理系统(SpringBoot前后端分离) 之 SpringBoot后台管理+Uniapp(混合APP)前端 SpringBoot前后端分离项目-Thymeleaf模板引擎景区旅游管 ...
- 基于SpringBoot前后端分离的众筹系统(附源码)
基于SpringBoot前后端分离的众筹系统源码下载链接: https://download.csdn.net/download/weixin_47367099/85441573 一.运行步骤 1.环 ...
- 新手摸爬滚打:vue+springboot前后端分离项目演示(三)——axios实现前后端交互
导语:路漫漫其修远兮,吾将上下而求索 前篇: 新手摸爬滚打:vue+springboot前后端分离项目演示(一)--vue cli创建vue2项目 新手摸爬滚打:vue+springboot前后端分离 ...
- SpringBoot前后端分离项目中如何制作前端jar包(类似swaggerUI前端jar包制作方法)
SpringBoot前后端分离项目中如何制作前端jar包(类似swaggerUI前端jar包制作方法) 可用于SpringBoot引用的前端UI的Jar包,类似于SwaggerUI包 WABJAR介绍 ...
- springBoot前后端不分离Vue+elementUI脚手架
新建SpringBoot2.4.4项目. 目录结构如下 新建html页面 login.js文件 接口 完整项目在我的资源中SpringBoot前后端不分离vue+element脚手架_springbo ...
- 基于vue springboot 前后端分离的电影院会员管理系统
基于vue springboot 前后端分离的电影院会员管理系统 文章目录 基于vue springboot 前后端分离的电影院会员管理系统 前言 一.主要功能 二.运行截图 1.前端package. ...
最新文章
- 全球AI技术开放日系列之(七):走进阿里业务中台
- java中的volatile和synchronized
- Thinkphp中import的几个用法详细介绍
- WatiN——Web自动化测试(三)【弹出窗口处理】
- Word2016怎么和mathtype兼容
- 新同事不讲“码”德,这SQL写得太野了,请耗子尾汁~
- 12306第一波春运售票高峰:“云查询”每秒40万次
- 项目管理沙龙第二次聚会纪要
- Tomcat8zip版本安装与配置
- 魔鬼数学——大数据时代,数学思维的力量
- 达梦数据库导出sql脚本
- 计算机维护岗位主要职责怎么写,计算机维护岗位职责.doc
- java生成PDF-支持中文及图片
- 语音编码标准(G.711 G.723 G.726 G.729 iLBC) .
- TortoiseSVN patch 创建并应用补丁
- 用Python在喜马拉雅音乐爬虫小试
- Ubuntu离线安装网卡驱动
- python停止线程_python线程之八:线程停止的3种方式,5个实例
- Python练习题答案: CIS 122#12中的构造【难度:1级】--景越Python编程实例训练营,1000道上机题等你来挑战
- 计算机组成原理南阳理工学院教务管理系统,南阳理工学院教务管理系统使用暂行办法...
热门文章
- Header背景处理方案
- 现在当兵有什么待遇复原以后_当兵五年后出来会有什么待遇,会安排工作吗,大概能给多少钱?...
- C#语言 Asp.net校园二手交易平台源码(asp.net校园二手交易系统 闲置物品交易系统 二手物品
- #大三狗的日常总结与反思07#
- 开罐即用系列-RSA加密解密
- bluehost php,BlueHost php.ini文件的生成位置
- Github相册博客搭建
- 20211009gfsj_re_六六六
- ACM至大二省赛小结
- Cow Contest (传递闭包)