💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接
目录
1. 编写一个SpringBoot Controller方法,接收两个整数参数a和b,并返回它们的和。
2. 创建一个User实体类,包含字段name和age。编写一个SpringBoot Controller方法,接收一个User实体对象,并返回该对象的详细信息。
3. 编写一个SpringBoot Controller方法,接收一个JSON字符串,该字符串包含两个字段name和age,并返回接收到的JSON字符串。
4. 编写一个SpringBoot Controller方法,接收以下参数。
一、项目结构
二、参数接收
1. Controller初始代码
package com.example.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller //用于指示Spring框架,被注解的类是一个控制器类,控制器负责处理传入的请求并将其映射到具体的处理方法上
@ResponseBody //控制器方法的返回值直接写入HTTP响应体中,以JSON、XML或其他格式的数据返回给客户端。可写在方法上有,也可写在类上(表示作用于所有方法)
public class UserController {
// ...省略具体的方法实现,这些方法用于接收HTTP请求参数并返回响应
}
2. 简单参数【参数可加@RequstParam】
(1)代码
UserController:
@RequestMapping("/simpleParam")
public String simpleParam(String name, String age) {
System.out.println(name + ":" + age);
return "OK";
}
(2)接口测试
GET和POST的区别
参数位置:
- GET请求:参数通常附加在URL之后,以查询字符串的形式出现,例如:http://localhost:8080/simpleParam?name=张三&age=22
- POST请求:参数通常放置在HTTP请求的消息体(body)中,不会显示在URL上。
安全性:
- GET请求:由于参数直接暴露在URL中,因此它不适合传递敏感信息,如密码等。
- POST请求:参数不会出现在URL中,因此更适合传递敏感信息。
数据大小:
- GET请求:由于URL的长度限制,GET请求传递的数据量有限。
- POST请求:理论上,POST请求可以传输更多的数据,因为数据不是通过URL传输的。
GET:
POST:
GET和POST均返回OK。
控制台输出:
张三:22
(3)注意事项
当controller中的参数名字和接口测试时传递的参数不完全一致时:
@RequestMapping("/simpleParam")
public String simpleParam(String username, String age) { //例如把name改成username
System.out.println(username + ":" + age);
return "OK";
}
GET请求:
http://localhost:8080/simpleParam?name=张三&age=22(name和username不对应)
控制台输出:
null:22
POSTMAN中查看GET返回的参数:
OK
解决方案:
加上注解@RequestParam("name")
@RequestMapping("/simpleParam")
// @RequestParam(value = "name") String username
// 表示将接口中传递的name参数映射成方法中的username(如果二者是同名的可以省略该注解)
// 默认了这个参数是必须传递的,如果不传递name则返回400状态码
public String simpleParam(@RequestParam(value = "name") String username, String age) {
System.out.println(username + ":" + age);
return "OK";
}
@RequestParam(name = "name", required = false)
如果设置required = false表示这个参数可传递也可不传递,如果设置required = true表示这个参数必须传递。
RequestParam注解内部:
required属性默认为true
3. 简单实体参数
在使用简单参数做为数据传递方式时,前端传递了多少个请求参数,后端controller方法中的形参就要书写多少个。如果请求参数比较多,通过上述的方式一个参数一个参数的接收,会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:请求参数名与实体类的属性名相同。
(1)代码
UserDTO代码:
package com.example.DTO;
public class UserDTO {
private String name;
private String age;
public UserDTO(String name, String age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "UserDTO{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
UserController代码:
@RequestMapping("/simplePojo") //接收参数时会调用相应的构造方法
public String simplePojo(UserDTO userDTO) {
System.out.println(userDTO);
return "OK";
}
(2)接口测试
控制台输出:
UserDTO{name='张三', age='22'}
(3)注意事项
控制台输出:
UserDTO{name='null', age='22'}
4. 复杂实体参数
复杂实体对象指的是,在实体类中有一个或多个属性,也是实体对象类型的。如下:
UserDTO类中有一个Address类型的属性(Address是一个实体类)
(1)代码
UserDTO代码:
package com.example.DTO;
import com.example.Pojo.Address;
public class UserDTO {
private String name;
private String age;
private Address address; //嵌套实体
//省略无参和有参构造方法, getter和setter, toString方法
}
Address实体代码:
package com.example.Pojo;
public class Address {
private String province;
private String city;
//省略无参和有参构造方法, getter和setter, toString方法
}
UserController代码:
@RequestMapping("/complexPojo")
public String complexPojo(UserDTO userDTO) {
System.out.println(userDTO);
return "OK";
}
(2)接口测试
控制台输出:
UserDTO{name='张三', age='22', address=Address{province='北京', city='北京'}}
5. 数组参数【参数不加@RequstParam】
使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。
多个值是怎么提交的呢?其实多个值也是一个一个的提交。 后端程序接收上述多个值的方式有两种:数组和集合。
(1)代码
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby) {
System.out.println(Arrays.toString(hobby));
return "OK";
}
(2)接口测试
请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
控制台输出:
[唱, 跳, rap]
6. 集合参数【参数要加@RequstParam】
默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系。
(1)代码
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby) {
System.out.println(hobby);
return "OK";
}
(2)接口测试
请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
控制台输出:
[唱, 跳, rap]
7. 日期参数【参数可加@DateTimeFormat】
在一些特殊的需求中,可能会涉及到日期类型数据的封装。日期的格式多种多样,可通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。
(1)代码
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
System.out.println(updateTime);
return "OK";
}
(2)接口测试
控制台输出:
2024-07-25T00:00
8. JSON参数【参数要加@RequestBody】
前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。 (JSON是开发中最常用的前后端数据交互方式)
传递json格式的参数,在Controller中会使用实体类进行封装。
封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
(1)代码
@RequestMapping("jsonParam")
public String jsonParam(@RequestBody UserDTO userDTO) {
System.out.println(userDTO);
return "OK";
}
(2)接口测试
控制台输出:
UserDTO{name='张三', age='16', address=Address{province='北京', city='北京'}}
9. 路径参数【参数要加@PathVariable】
在现在的开发中,经常还会直接在请求的URL中传递参数。 路径参数前端通过请求URL直接传递参数,后端使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数。
(1)代码
@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id, @PathVariable String name) {
System.out.print(id + "-" + name);
return "OK";
}
(2)接口测试
控制台输出:
1-张三
三、响应参数
1. RestController
@RestController = @Controller + @ResponseBody
@RestController底层源码
类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据
方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器。
2. Controller初始代码
package com.example.Controller;
import org.springframework.web.bind.annotation.RestController;
@RestController //@RestController = @Controller + @ResponseBody
public class ResponseController {
}
3. 响应返回字符串
(1)代码
@RequestMapping("/getString")
public String getString(){
return "Hello";
}
(2)接口测试
4. 响应返回集合
(1)代码
@RequestMapping("/getList")
public List<Integer> getList(){
return List.of(1,2,3,4,5);
}
(2)接口测试
5. 响应返回实体类
(1)代码
@RequestMapping("/getEntity")
public Address getEntity(){
return new Address("北京","北京");
}
(2)接口测试
6. 统一响应结果
前端开发人员拿到的响应数据,没有统一的规范。对前端开发人员业讲就需要针对不同的响应数据,使用不同的解析方式。上述这种情况就会造成:开发成本高、项目不方便管理、维护起来也比较难。
如果开发一个大型项目,项目中controller方法将成千上万,使用上述方式将造成整个项目难以维护。那在真实的项目开发中,都会定义一个统一的返回结果。方案如下:
(1)Result<T>类
package com.example.Result;
import java.io.Serializable; // 导入Serializable接口,用于实现序列化
public class Result<T> implements Serializable { //实现Serializable接口,以便于序列化
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
public static <T> Result<T> success() {
Result<T> result = new Result<T>();
result.code = 1;
return result;
}
public static <T> Result<T> success(T object) {
Result<T> result = new Result<T>();
result.data = object;
result.code = 1;
return result;
}
public static <T> Result<T> error(String msg) {
Result result = new Result();
result.msg = msg;
result.code = 0;
return result;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
(2)返回字符串
@RequestMapping("/getStringResult")
public Result<String> getStringResult(){
return Result.success("Hello World");
}
(3)返回集合
@RequestMapping("/getListResult")
public Result<List> getListResult(){
return Result.success(List.of(1, 2, 3, 4, 5));
}
(4)返回实体类
@RequestMapping("/getEntityResult")
public Result<Address> getEntityResult(){
return Result.success(new Address("北京","北京"));
}
四、练习
1. 编写一个SpringBoot Controller方法,接收两个整数参数a和b,并返回它们的和。
@RestController
public class TestController {
@RequestMapping("/add")
public int add(@RequestParam(value = "a") int a,
@RequestParam(value = "b") int b) {
return a + b;
}
}
2. 创建一个User实体类,包含字段name和age。编写一个SpringBoot Controller方法,接收一个User实体对象,并返回该对象的详细信息。
@RestController
public class TestController {
@RequestMapping("/user")
public User user(User user){
return user;
}
}
3. 编写一个SpringBoot Controller方法,接收一个JSON字符串,该字符串包含两个字段name和age,并返回接收到的JSON字符串。
@RestController
public class TestController {
@RequestMapping("/json")
public void receiveJson(@RequestBody User user) {
System.out.println(user);
}
}
4. 编写一个SpringBoot Controller方法,接收以下参数。
- 数组参数ids
- 集合参数names
- 时间日期参数date
- 路径参数id
@RestController
public class TestController {
@RequestMapping("/params/{id}")
public String Params(@PathVariable Integer id,
@RequestParam List<String> names,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date,
int[] ids) {
System.out.println(id);
System.out.println(names);
System.out.println(date);
System.out.println(Arrays.toString(ids));
return "OK";
}
}
5. 编写一个Spring Boot的Controller方法,返回一个统一的响应结果,包含状态码、消息和数据。当请求路径为"/getSuccess"时,返回成功状态码和数据;当请求路径为"/getError"时,返回错误状态码和消息。
@RestController
public class TestController {
@RequestMapping("/getSuccess")
public Result<String> getSuccess() {
return Result.success("Success");
}
@RequestMapping("/getError")
public Result<String> getError() {
return Result.error("Error");
}
}