请求
测试准备工作
IDEA springboot项目,加入依赖web -> spring web。其他代码:
User类:
public class User {
private String name;
private Integer age;
private Address address;
//Getter和Setter方法...
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
Address类:
public class Address {
private String province;
private String city;
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
//Getter和Setter方法...
}
测试类:
@RestController
public class RequestController {
//如下测试代码
}
@RestController
结合了 @Controller
和 @ResponseBody
注解的功能
- @Controller:被
@Controller
标记的类实际上就是个SpringMVC Controller对象,它是一个控制器类,负责处理通过 DispatcherServlet 分发的请求。通常与@RequestMapping
(或其派生注解如@GetMapping
、@PostMapping
等)联用,当SpringMVC获取到请求时会转发到指定路径的方法进行处理。(作用类似于管家) - @ResponseBody:
@ResponseBody
用于将控制器的返回值自动转换为 JSON 或 XML 等格式,并写入 HTTP 响应体中。如果没有@ResponseBody
,就需手动创建响应对象,设置响应头,数据转换并写入响应体。
简单参数web程序比较
原始web程序
使用 HttpServletRequest
手动获取参数
@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";
}
这种写法虽然灵活性较高,但过于繁琐。
springboot方式
使用方法参数自动绑定参数,请求参数名与方法参数名设置为相同即可直接接收请求的参数。
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name, Integer age){
System.out.println(name+ ":" + age);
return "OK";
}
使用Postman进行测试一下:
控制台输出:
测试成功。
(请求方式随意,@RequestMapping
没有指定允许的 HTTP 方法会匹配 所有类型的 HTTP 方法。这意味着无论客户端使用哪种 HTTP 方法发起请求,只要路径匹配,就会触发相应的方法处理)
@RequestMapping(“/”):@RequestMapping(value = “path”, method = RequestMethod.method)
- value/path:定义请求的 URL 路径(单参数时可以不写参数名,直接写路径)
- method:指定允许的 HTTP 方法,如
RequestMethod.GET、RequestMethod.POST、RequestMethod.PUT
- params、headers等其他参数
自定义绑定方式
什么的方法中自动绑定参数,需要请求参数名与方法参数名相同,但如果不同又要绑定,就用如下写法:
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){
System.out.println(username+ ":" + age);
return "OK";
}
@RequestParam(name = "name", required = false)
告诉Spring MVC,HTTP请求中应该有一个名为name
的参数,并且这个参数的值应该被绑定到方法的username
参数上。即使你在方法签名中使用了username
作为参数名,@RequestParam
的name
属性仍然指定了请求参数的实际名称。
@RequestParam( )参数介绍:
- name/value:指定请求参数的名字。
- defaultValue:参数提供一个默认值。如果请求中没有提供该参数,或者参数值为空字符串(””),则使用默认值。(对下面来说,你可以通过不提供
defaultValue
来隐式地表示参数是必需的) - required:参数是否必需,但
@RequestParam
本身没有直接的required
属性,在某些情况下,你可能会看到required=false
或required=true
的用法,但这通常是通过@RequestParam
的一个自定义变体或与其他注解(如@ApiParam
在 Swagger 中)结合使用来实现的,而不是@RequestParam
本身的标准属性。
其他参数处理
实体参数
如果参数是个类会怎么样呢?先介绍一下定义:
- 简单实体对象:结构相对简单、属性较少的实体对象。
- 复杂实体对象:结构复杂、属性较多且可能包含与其他实体对象之间复杂关系的实体对象。
简单实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
简单测试一下,给name和age传递参数,先不给address传递(Spring MVC会尝试从HTTP请求中提取数据,并自动将这些数据填充到User对象的属性中,而不是直接给user变量本身赋值(因为user是一个对象引用,赋值(针对对象)通常意味着改变引用指向的对象,而不是修改对象的内部状态))。
控制台输出:
复杂实体参数
从User类中可以看到address是个对象。
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "OK";
}
参数传递方式如下:
控制台输出:
数组集合参数
不多介绍,自己看
数组
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
控制台输出:
集合
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
这里的@RequestParam
是必需的,因为它告诉Spring MVC期望在请求参数中找到名为hobby
的多个值,并将它们收集到一个List<String>
(即对象)中。但当你使用数组(即基本数据类型)作为参数时,Spring MVC有一种内置的机制来识别和处理具有相同名称的多个请求参数。
控制台输出:
日期参数
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
控制台输出:
@DateTimeFormat参数介绍:
- pattern:用于指定日期格式的模式字符串。
- style:用于指定日期的样式,如短日期、中日期、长日期等。但在实际使用中,
pattern
属性更为常用。 - iso和fallbackPatterns等
JSON 参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
控制台输出:
@RequestBody
是 Spring MVC 中用于将 HTTP 请求体 中的内容转换为 Java 对象的注解,通常用在接收复杂 JSON 数据的场景中。
路径参数
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
控制台输出:
@PathVariable
是 Spring MVC 中用于获取 URL 路径中占位符参数的注解。它将路径中的动态部分绑定到方法参数上。
多参数也是可以的。
@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id , @PathVariable String name){
System.out.println(id);
System.out.println(name);
return "OK";
}
响应
添加准备代码
Result类:
public class Result {
private Integer code ;//1 成功 , 0 失败
private String msg; //提示信息
private Object data; //数据 date
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
//Getter和Setter方法...
public static Result success(Object data){
return new Result(1, "success", data);
}
public static Result success(){
return new Result(1, "success", null);
}
public static Result error(String msg){
return new Result(0, msg, null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
测试类:
@RestController
public class ResponseController {
//如下测试代码
}
响应测试
@RequestMapping("/hello")
public Result hello(){
System.out.println("Hello World ~");
return Result.success("Hello World ~");
}
@RequestMapping("/getAddr")
public Result getAddr(){
Address addr = new Address();
addr.setProvince("广东");
addr.setCity("深圳");
return Result.success(addr);
}
@RequestMapping("/listAddr")
public Result listAddr(){
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("广东");
addr.setCity("深圳");
Address addr2 = new Address();
addr2.setProvince("陕西");
addr2.setCity("西安");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
测试结果: