当前位置: 首页 > news >正文

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

目录

  • 请求响应
    • 请求
      • Postman 工具
      • 简单参数请求
      • 实体参数请求
      • 数组集合参数
      • 日期参数
      • JSON 参数
      • 路径参数
    • 响应

请求响应

请求

Postman 工具

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

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

简单参数请求

  1. 原始方式

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

    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 方式

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

    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 完成映射

    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

    public String simpleParam(@RequestParam(name="name", required=true)String username, Integer age)
    

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

实体参数请求

  1. 简单实体对象:请求参数名与形参对象属性名相同,定义 POJO 接收即可
    假设前端传递 name 和 age 两个参数,则实体类可以定义为:

    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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
    }
    

    请求参数的方法为:

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

    有个实体类 User 定义如下

    public class User {private String name;private Integer age;private Address address;
    }
    

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

    public class Address {private String province;private String city;
    }
    

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

    在这里插入图片描述

数组集合参数

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

    请求数组参数方法为:

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

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

    在这里插入图片描述

    控制台获取到数组参数

    在这里插入图片描述

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

    请求集合参数的方法为

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

    传递参数与数组参数一样

    在这里插入图片描述

日期参数

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

    请求参数的方法为:

    @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 标识

请求参数的方法为:

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

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

在这里插入图片描述

路径参数

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

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

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

在这里插入图片描述

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

@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 即可。

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

@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格式的数组

在这里插入图片描述

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

/*
* 统一响应结果封装类
*/
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);}@Overridepublic String toString() {return "Result{" +"code=" + code +", message='" + message + '\'' +", data=" + data +'}';}
}

将原来的方法改为:

@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);}
}

如此一来,响应格式就全部统一了
在这里插入图片描述

http://www.lryc.cn/news/602202.html

相关文章:

  • 搜索引擎高级搜索指令大全(Google、百度等浏览器通用)
  • nvim cspell
  • 打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
  • 中国自然灾害影响及损失数据
  • Ubuntu 安装redis和nginx
  • 【JSqlParser】sql解析器使用案例
  • jimfs:Java内存文件系统,脱离磁盘IO瓶颈利器
  • 全球Wi-Fi室外天线市场洞察2024–2032:规模、驱动因素与技术演进
  • Mybatis_4
  • Focusing on Tracks for Online Multi-Object Tracking—CVPR2025多目标跟踪(TrackTrack)
  • Ethereum:Geth运维实战,geth export与geth import命令的实用性深度评估
  • 使用 Qt Installer Framework(IFW)进行打包
  • 网络安全第14集
  • 8.1 ESP32CAM 服务器 网络摄像头
  • 【mysql】—— mysql中的timestamp 和 datetime(6) 有什么区别,为什么有的地方不建议使用timestamp
  • 深入探索Linux:忙碌的车间“进程”间通信
  • 【Linux】基本指令(2)
  • Linux DNS解析1--终端通过网关或者路由器进行域名解析的原理
  • WAIC 2025深度解析:当“养虎”警示遇上机器人拳击赛
  • 设计模式(二十二)行为型:策略模式详解
  • 发布“悟能”具身智能平台,商汤让机器人像人一样和现实世界交互
  • 枚举策略模式实战:优雅消除支付场景的if-else
  • 时序数据基座升维:Apache IoTDB 以“端边云AI一体化”重构工业智能决策
  • 企业级JWT验证最佳方案:StringUtils.hasText()
  • 【学习路线】AI开发工程师成长指南:从机器学习基础到大模型应用
  • Ubuntu服务器上JSP运行缓慢怎么办?全面排查与优化方案
  • Python 列表内存存储本质:存储差异原因与优化建议
  • 【Linux | 网络】传输层(UDP和TCP) - 两万字详细讲解!!
  • 二级域名分发源码最新开源版
  • uni-datetime-picker兼容ios