访问不同的路径,就是发送不同的请求。在发送请求时,可能会带一些参数,所以学习 Spring 的请求,主要是学习如何传递参数到后端,以及后端如何接收
传递参数,我们主要是使用浏览器和 Postman 来模拟
后端开发人员无需太过于关注如何传递参数,了解即可,实际开发中以 Postman 测试为主 比如餐厅的厨师,不关注用户是在店里下单还是外卖平台下单,只需要知道如何让接受订单,根据订单做出对应的菜肴就可以了
接受单个参数,在 Spring MVC 中直接用方法中的参数就可以,比如以下代码:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/param")
@RestController
public class UserController {
@RequestMapping("/m1")
public String method1(String name) {
return "接收到参数:name="+name;
}
}
可以看到,后端程序正确拿到了 name
参数的值。Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法
如果参数不一致,是获取不到参数的,比如请求 URL: http://127.0.0.1:8080/param/m1?name1=spring ,响应结果:
使用基本类型来接收参数时,参数必须传(除 boolean 类型),否则会报 500 错误;类型不匹配时,会报 400 错误
@RequestMapping("/m1/int")
public String method1GetInt(int age) {
return "接收到参数:age="+age;
}
http://127.0.0.1:8080/param/m1/int?age=18 浏览器响应情况:
通过 Fiddler
观察请求和响应,HTTP
响应状态码为 200
,Content-Type
为 text/html
http://127.0.0.1:8080/param/m1/int 浏览器响应情况:
通过 Fiddler
观察请求和响应,HTTP
响应状态码为 500
尝试观察程序的错误日志,并解决问题:
一般看日志堆栈信息的首行,报错信息显示:
int
类型的参数‘ age
’,虽然为可选的,但由于被声明为基本类型而不能被转换为空值。考虑将其声明为对应基本类型的包装类型
包装类型可以为 null
,当把类型变成 Integer
之后:
null
。所以企业开发中,对于参数可能为空的数据,建议使用包装类型http://127.0.0.1:8080/param/m1/int?age=abc
通过 Fiddler 观察请求和响应,HTTP 响应状态码为 400
如何接收多个参数呢? 和接收单个参数一样,直接使用方法的参数接收即可。使用多个形参
@RequestMapping("/m2")
public String method2(String name, String password) {
return "接收到参数:name=" + name + ", password=" + password;
}
name
和 password
参数的值 当有多个参数的时候,前后端进行参数匹配的时候,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果
如果参数比较多时,方法声明就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明。我们不妨把这些参数封装为一个对象。
Spring MVC 也可以自动实现对象参数的赋值,比如 Person
对象:
public class Person {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
对象传递代码实现:
@RequestMapping("/m3")
public Object method3(Person person) {
return person.toString();
}
null
(基本类型则赋值为默认初始值,比如 int
类型的属性,会被复赋值为 0)