【Spring Boot 快速入门】二、请求与响应

目录

请求响应

请求

Postman 工具

Postman 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件

作用:常用于进行接口测试

简单参数请求

  1. 原始方式

    在原始的 Web 程序中,获取请求参数,需要通过 HttpServletRequest 对象手动获取(繁琐,手动类型转换)

    java 复制代码
    import jakarta.servlet.http.HttpServletRequest;
    import org.springframework.boot.autoconfigure.graphql.GraphQlProperties;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @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:"+name+" age:"+age);
            return "success";
        }
    }

    用 GET 请求在 Postman 中输入对应的 API 并设置参数,点击发送

后端服务器接收数据成功显示"success"。

  1. Spring Boot 方式

    简单参数:参数名与形参变量名相同,定义形参即可接收参数

    java 复制代码
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class RequestController {
        @RequestMapping("/simpleParam")
        public String simpleParam(String name, Integer age){
            // 获取请求参数
            System.out.println("name:"+name+" age:"+age);
            return "success";
        }
    }

    用 POST 请求则是在 Postman 中输入对应的 API,在响应体中设置参数,点击发送

    后端服务器接收数据成功显示"success"。

  2. 如果方法形参名称与请求参数名称不匹配,可以使用 @RequestParam 完成映射

    java 复制代码
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class RequestController {
        @RequestMapping("/simpleParam")
        public String simpleParam(@RequestParam(name="name")String username, Integer age){
            // 获取请求参数
            System.out.println("name:"+username+" age:"+age);
            return "success";
        }
    }

    注意:用 @RequestParam 映射的参数必须传递,不传递则会报错,因为参数的 required 属性默认是 true

    java 复制代码
    public String simpleParam(@RequestParam(name="name", required=true)String username, Integer age)

    如果将 true 改为 false,不传递也不会报错

实体参数请求

  1. 简单实体对象:请求参数名与形参对象属性名相同,定义 POJO 接收即可

    假设前端传递 name 和 age 两个参数,则实体类可以定义为:

    java 复制代码
    public class User {
        private String name;
        private Integer age;
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    请求参数的方法为:

    java 复制代码
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
    	// 获取请求参数
    	System.out.println(user);
    	return "success";
    }
  2. 复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套 POJO 属性参数

    有个实体类 User 定义如下

    java 复制代码
    public class User {
        private String name;
        private Integer age;
        private Address address;
    }

    其中嵌套着另一个实体类 Address,定义如下:

    java 复制代码
    public class Address {
        private String province;
        private String city;
    }

    如果说要传递值,则为 address.province=guangdongaddress.city=guangzhou

数组集合参数

  1. 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数

    请求数组参数方法为:

    java 复制代码
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] names){
    	// 获取请求参数
    	System.out.println(Arrays.toString(names));
    	return "success";
    }

    传递参数时只需要一个一个传就可以了

    控制台获取到数组参数

  2. 集合参数:请求参数名与形参集合名称相同且请求参数为多个,用 @RequestParam 绑定参数关系

    请求集合参数的方法为

    java 复制代码
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> names){
    	// 获取请求参数
    	System.out.println(names);
    	return "success";
    }

    传递参数与数组参数一样

日期参数

  1. 日期参数:使用 @DateTimeFormat 注解完成日期参数格式转换

    请求参数的方法为:

    java 复制代码
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
    	// 获取请求参数
    	System.out.println(updateTime);
    	return "success";
    }

    注意:如果月份是个位数,要在前面加 0 才能成功传递参数

JSON 参数

JSON 参数:JSON 数据键名与形参对象属性名相同,定义 POJO 类型形参即可接收参数,需要使用 @RequestBody 标识

请求参数的方法为:

java 复制代码
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
	// 获取请求参数
	System.out.println(user);
	return "success";
}

传递参数给后端要按照 JSON 格式,并且实体类中的变量名要与请求参数 JSON 中的一致

路径参数

路径参数:通过请求 URL 直接传递参数,使用 {...} 来标识该路径参数,需要使用 @PathVariable 获取路径参数

java 复制代码
@RequestMapping("/path/{id}") // path后面的id不能写死,应该动态的获取
public String pathParam(@PathVariable Integer id){
	// 获取请求参数
	System.out.println(id);
	return "success";
}

传递参数的时候就不用设置参数值了,直接填写 URL 即可

如果要用多个路径参数,只需在前一个后面加上"/参数名"即可

java 复制代码
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name){
	// 获取请求参数
	System.out.println(id + " " + name);
	return "success";
}

响应

服务端在方法或者类上添加 @ResponseBody 来以 JSON 格式响应返回结果

关于服务端的响应部分其实在请求部分就有涉及,每当请求发送成功后,服务端都会返回一个"success",但是在之前的代码中并没有 @ResponseBody 注解,这是因为 @RestController = @Controller + @ResponseBody,也就是说用只需添加 @RestController 即可。

由于返回的数据类型不同,响应格式也有差异

java 复制代码
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World~";
    }

    @RequestMapping("/getAddress")
    public Address getAddress() {
        Address ad = new Address();
        ad.setProvince("广东");
        ad.setCity("深圳");
        return ad;
    }

    @RequestMapping("/getAddresses")
    public List<Address> getAddresses() {
    	List<Address> list = new ArrayList<>();
    	Address ad = new Address();
    	ad.setProvince("广东");
    	ad.setCity("深圳");
        Address ad2 = new Address();
        ad2.setProvince("广西");
        ad2.setCity("桂林");
    	list.add(ad);
        list.add(ad2);
    	return list;
    }
}

响应的格式有字符串、JSON 格式、JSON格式的数组

这样响应的格式不规范,不便管理和维护,所以要创建一个响应结果封装类来统一响应结果

java 复制代码
/*
* 统一响应结果封装类
*/
public class Result {
    private Integer code; // 状态码,200为成功,500为失败
    private String message; // 返回消息
    private Object data; // 返回数据

    public Result(Integer code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {return code;}

    public void setCode(Integer code) {this.code = code;}

    public String getMessage() {return message;}

    public void setMessage(String message) {this.message = message;}

    public Object getData() {return data;}

    public void setData(Object data) {this.data = data;}

    public static Result success(Object data) {
        return new Result(200, "success", data);
    }

    public static Result success() {
        return new Result(200, "success", null);
    }

    public static Result error(String message) {
        return new Result(500, message, null);
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}

将原来的方法改为:

java 复制代码
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public Result hello() {
        return Result.success("hello world");
    }

    @RequestMapping("/getAddress")
    public Result getAddress() {
        Address ad = new Address();
        ad.setProvince("广东");
        ad.setCity("深圳");
        return Result.success(ad);
    }

    @RequestMapping("/getAddresses")
    public Result getAddresses() {
    	List<Address> list = new ArrayList<>();
    	Address ad = new Address();
    	ad.setProvince("广东");
    	ad.setCity("深圳");
        Address ad2 = new Address();
        ad2.setProvince("广西");
        ad2.setCity("桂林");
    	list.add(ad);
        list.add(ad2);
    	return Result.success(list);
    }
}

如此一来,响应格式就全部统一了

相关推荐
_風箏2 分钟前
Java【代码 15】文件操作相关方法(获取文件、复制文件、创建文件夹、获取图片文件、写出数据到文件、清理文件夹)
后端
Bohemian15 分钟前
实现一个单机版令牌桶限流器(字节)
后端·面试
风一样的树懒18 分钟前
ES是如何实现Master选举的?
后端
00后程序员18 分钟前
移动端 WebView 调试实战,多平台行为差异排查与统一调试流程
后端
Hejjon39 分钟前
携带参数的表单文件上传 axios, SpringBoot
java·spring boot·后端
sivdead1 小时前
从被动查询到主动智能:数据应用智能体的技术演进路线图
人工智能·后端·架构
阿宙ppppp1 小时前
基于yolov5+LPRNet+flask+vue的车牌识别(2)
后端·图像识别
荔枝爱编程1 小时前
高性能企业级消息中心架构实现与分享(三):数据存储设计与高可用保障
spring boot·后端·消息队列
武昌库里写JAVA1 小时前
【MySQL】MySQL数据库如何改名
java·vue.js·spring boot·sql·学习