简单参数
1. 原始方式获取请求参数
Controller方法形参中声明httpServletRequest对象
调用对象的getParameter参数名
@RestController
public class RequestController {
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
String name = request.getParameter("name");
String ageStr = request.getParameter("age");
int age = Integer.parseInt(ageStr);
System.out.println(name+" "+age);
return "OK";
}
}
2.SpringBoot中接受简单参数
请求参数名与方法形变量名相同
自动进行类型转换
@RestController
public class RequestController {
@RequestMapping("/simpleParam")
public String simpleParam(String name,Integer age){
System.out.println(name+" "+age);
return "OK";
}
}
3.RequestParam注解
如果遇到参数名称不匹配的问题,可以用@RequestParam进行映射
注意,当启用了RequestParam,你需要知道RequestParam的required属性默认是true,代表请求参数必须传递,如果不传递可能会报错
防止报错,可以将required=false;
@RestController
public class RequestController {
@RequestMapping("/simpleParam2")
public String simpleParam2(@RequestParam(name="name")String username, Integer age){
System.out.println(username+" "+age);
return "OK";
}
}
测试
我测试的工具是用的Postman,走Get和Post都可以
GET,在响应头上传递参数
在这里插入图片描述
POST,在响应体上传递参数
实体参数
请求规则:请求参数名与形参对象属性名称保持相同,即可直接通过POJO接收。
1.简单实体对象
简单参数定义一个两个还好(比如我定义用户名、密码),但是如果针对用户信息存在比较密集的参数,可能不太容易进行响应和请求。
为了解决这个问题,可以把信息都封装到实体参数中。
首先我们需要在java中做好封装,我们在com.ztt.Pojo包下封装一个User类,其中实现好私有变量的Get和Set方法以及toString方法。
package com.ztt.Pojo;
public class User {
private String name;
private Integer age;
public void setName(String name){
this.name = name;
}
public void setAge(Integer age){
this.age = age;
}
public Integer getAge()
{
return this.age;
}
public String getName()
{
return this.name;
}
@Override
public String toString()
{
return "User{"+
"name="+name+
"age="+age;
}
}
在RequestController中定义好方法
import com.ztt.Pojo.User; //记得给User引用
@RestController
public class RequestController {
@RequestMapping("/simplePojo")
public String simplePojo(User user)
{
System.out.println(user);
return "OK";
}
}
调试通过
2.复杂实体对象
我们这个实体对象不仅有String和Integer,还引入一个address.
首先新建Address类,包含了私有变量city和province,以及对应的set、get和toString方法。
package com.ztt.Pojo;
public class Address {
private String city;
private String province;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
", province='" + province + '\'' +
'}';
}
}
在User类中新加入Address以及其相关的set和get方法
package com.ztt.Pojo;
public class User {
private String name;
private Integer age;
private Address address;
public void setName(String name){
this.name = name;
}
public void setAge(Integer age){
this.age = age;
}
public Integer getAge()
{
return this.age;
}
public String getName()
{
return this.name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
在RequestController中定义请求方法(其实和简单实体参数的请求一样、基本上不用变)
import com.ztt.Pojo.User; //记得给User引用
@RestController
public class RequestController {
@RequestMapping("/complexPojo")
public String complexPojo(User user)
{
System.out.println(user);
return "OK";
}
}
利用Postman发送请求(返回OK)
数组参数
使用场景:比如使用多选框进行多目标选取。
接收方式可以采用数组接受,也可以选择集合接受。
@RestController
public class RequestController {
// 数组进行集合的封装
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby)
{
System.out.println(Arrays.toString(hobby));
return "OK";
}
// 利用集合进行参数的封装
// 使用集合封装时,需要采用@RequestParam对形参定义,因为默认集合是封装到数组类型中的
@RequestMapping("/listParam")
public String arrayParam(@RequestParam List<String> hobby)
{
System.out.println(hobby);
return "OK";
}
}
日期参数
由于日期记录的形式比较丰富,所以在日期参数传递的过程中,需要使用@Dat 注解进行日期参数格式转换。
import java.time.LocalDateTime;
@RestController
public class RequestController {
@RequestMapping("/dateParam")
public String dateParam(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime)
{
System.out.println(updateTime);
return "OK";
}
}
注:如果时间格式不匹配就会出现这样的错误:
Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘java.time.LocalDateTime’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] for value [2023-8-11 10:06:54]; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2023-8-11 10:06:54]]
JSON参数
JSON参数中JSON数据键名与形参对象属性名保持一致,定义POJO类型形参可以接受参数,同时需要使用@RequestBody标识。
@RestController
public class RequestController {
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user)
{
System.out.println(user);
return "OK";
}
}
POST中数据体
{
“name”:“张三”,
“age”:10,
“address”:{
“province”:“beijing”,
“city”:“北京”
}
}
Postman中发送格式
路径参数
路径参数的请求直接通过URL传递参数
在java中可以通过占位符{…}来标识路径参数,通过@PathVariable获取路径参数.
使用写死的方法也可以,只不过占位符的方法更灵活一些。
@RestController
public class RequestController {
// 简单参数请求
@RequestMapping("/path/{id}")
public String urlParam(@PathVariable Integer id)
{
System.out.println(id);
return "OK";
}
// 复杂参数请求
@RequestMapping("/path/{id}/{name}")
public String urlParam2(@PathVariable Integer id,@PathVariable String name)
{
System.out.println(id);
System.out.println(name);
return "OK";
}
}
请求方式可以直接在浏览器输入路径
http://localhost:8080/path/100
http://localhost:8080/path/1/Tom
(PS:用postman发送也可以)