SpringBoot前后端参数传递⽅式总结
前⾔: 因为总是需要使⽤不同的参数传递⽅式,所以特地来总结⼀下SpringBoot中常⽤的参数的绑定⽅式,给有需要的朋友查阅。SpringBoot参数传递
注意:虽然Restful风格很流⾏,但是⼤部分还是主要是GET和POST的内容,所以这⾥只是列举GET和POST请求为例。 ⽽且,⽆论怎么样的花样传参,它都是符合上⾯这个报⽂结构的!正所谓:万变不离其宗嘛!
GET请求⽅式
注意:我这⾥是⽰例形式是:代码+Postman测试截图+Fiddler抓包截图。
01.单个键值对参数
/**
* 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。但是,我倾向于还是显⽰使⽤注解,这样⽐较清晰,也可配置,更加灵活。
02.多个键值对参数
/**
* 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;
}
03.键值对映射对象
*  使⽤对象对参数进⾏封装,这样在多个参数时,优势很明显。
*  但是这⾥⽆法使⽤ @RequestParam注解,否则会出错。
* */
@GetMapping("/get04")
public Comment get04(Comment comment) {
if (Objects.isNull(comment)) {
return null;  // 需要对 null 值进⾏处理
}
System.out.println(comment);
return comment;
}
04.键值对映射Map
/**
* 使⽤对象封装参数要求必须具有⼀个对象,所以可以使⽤ 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;
}
05.路径参数
/**
* 参数和路径结合,适⽤于单个参数的情况
* */
@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;
}
请求直接写在路径上,成为路径的⼀部分
06.返回值为⼆进制
前⾯都是⽂本数据,现在我们尝试来获取⼆进制数据,注意这个⽅法需要下⾯的上传⽂件⽅法向上传⽂件,或者你⾃⼰在⽂件夹下⾯放⼊⼀个⽂件。
* 返回值为⼆进制
* 其实这⾥可以使⽤ adAllBytes()这个⽅法,这样就简单了。这⾥我就不改了,我习惯了使⽤这种
* 循环读取的⽅式,不过确实有点繁琐了。
* */
@GetMapping("/get07/{name}")
public void getFile(@PathVariable("name") String name, HttpServletResponse response) {
try (OutputStream out = new OutputStream())) {
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();
}
springboot结构}
POST请求⽅式
01.多个键值对参数
/**
* 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;
}
05.json数组映射List
@PostMapping("/post05")
public List<Comment> post05(@RequestBody List<Comment> commentList) {
return commentList;
}
06.传递⼆进制数据(⽂件)
/**
* 传递⼆进制数据
* */
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
String fileName = OriginalFilename();
try {
return "success";
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "Fail";
}
8.表单数据(⽂本+⽂件)
/**
*  表单数据,含⽂本和⼆进制
* */
@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 ? OriginalFilename() : "null");
if (!file.isEmpty()) {
String fileName = OriginalFilename();
try {
return "success";
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "Fail";
}
09.表单数据,进⼀步封装成对象
上⾯那样如果表单项⽐较多的话,映射还是⽐较⿇烦的,可以选择创建⼀个对象封装所有的属性,这样处理起来就会更加⽅便,并且也是⾯向对象思想的应⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。