SpringBootWeb请求响应

2024-01-02 10:16:31

请求

简单参数

在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
在这里插入图片描述

原始方式知道原理即可,实际开发不会采用

在原始的Web程序当中,需要通过Servlet中提供的API:HttpServletRequest(请求对象),获取请求的相关信息。比如获取请求参数:
http请求时,服务器会把请求的相关信息封装到HttpServletRequest对象中
Controller中,我们要想获取Request对象,可以直接在方法的形参中声明HttpServletRequest 对象。然后就可以通过该对象来获取请求信息:

//根据指定的参数名获取请求参数的数据值
String request.getParameter("参数名")

关于文中出现的注解可在其他文章中了解

@RestController
public class RequestController {
//原始方式
	@RequestMapping("/simpleParam")
	public String simpleParam(HttpServletRequest request){
		// http://localhost:8080/simpleParam?name=Tom&age=10
		// 请求参数: name=Tom&age=10 (有2个请求参数)
		// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
		// 第2个请求参数: age=10 参数名:age , 参数值:10
		String name = request.getParameter("name");//name就是请求参数名
		String ageStr = request.getParameter("age");//age就是请求参数名
		int age = Integer.parseInt(ageStr);//需要手动进行类型转换
		System.out.println(name+" : "+age);
		return "OK";
 	}
}

SpringBoot方式,主流方式

在Springboot的环境中,对原始的API进行了封装,接收参数的形式更加简单。 如果是简单参数,参数名与形参变量名相同,定义同名的形参即可接收参数。

@RestController
public class RequestController {
	// http://localhost:8080/simpleParam?name=Tom&age=10
	// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
	// 第2个请求参数: age=10 参数名:age , 参数值:10
	//springboot方式
	@RequestMapping("/simpleParam")
	public String simpleParam(String name , Integer age ){
		//形参名和请求参数名保持一致
		System.out.println(name+" : "+age);
		return "OK";
 	}
}
请求参数名与形参变量名不一样会发生什么?controller方法中的形参还能接收到请求参数值吗?
@RestController
public class RequestController {
	// http://localhost:8080/simpleParam?name=Tom&age=20
	// 请求参数名:name
	//springboot方式
	@RequestMapping("/simpleParam")
	public String simpleParam(String username , Integer age ){
		//请求参数名和形参名不相同
		System.out.println(username+" : "+age);
		return "OK";
 	}
}

运行没有报错。 controller方法中的username值为:null,age值为20
结论:对于简单参数来讲,请求参数名和controller方法中的形参名不一致时,无法接收到请求数据

如何处理?

使用Spring提供的@RequestParam注解完成映射,在方法形参前面加上 @RequestParam 然后通过value属性执行请求参数名,从而完成映射。代码如下:

@RestController
public class RequestController {
	// http://localhost:8080/simpleParam?name=Tom&age=20
	// 请求参数名:name
	//springboot方式
	@RequestMapping("/simpleParam")
	public String simpleParam(@RequestParam("name") String 	username, Integer age ){
	System.out.println(username+" : "+age);
	return "OK";
 	}
}

注意:@RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错,但可以手动设置为false

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required =
false) String username, Integer age){
	System.out.println(username+ ":" + age);
	return "OK";
}

实体参数

在使用简单参数做为数据传递方式时,前端传递了多少个请求参数,后端controller方法中的形参就要书写多少个。如果请求参数比较多,通过上述的方式一个参数一个参数的接收,会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:

  • 简单实体参数
    在这里插入图片描述

  • 复杂实体参数
    请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套实体类属性参数。
    在实体类中有一个或多个属性,也是实体对象类型的。如:User类中有一个Address类型的属性(Address是一个实体类)
    在这里插入图片描述

  • 数组集合参数
    在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值

    • 请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
      在这里插入图片描述
    • 请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系
      在这里插入图片描述

日期参数

因为日期的格式多种多样(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。

  • @DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。
  • 后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。
    在这里插入图片描述

JSON参数

  • 传递json格式的参数,在Controller中会使用实体类进行封装。
  • 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用@RequestBody标识。
    在这里插入图片描述

路径参数

传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面通过?key=value的形式传递(GET请求)
在现在的开发中,经常还会直接在请求的URL中传递参数。例如:
http://localhost:8080/user/1
http://localhost:880/user/1/0

  • 前端:通过请求URL直接传递参数
  • 后端:使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
    在这里插入图片描述

文章来源:https://blog.csdn.net/DaZongShi0/article/details/135221444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。