SpringBoot Web请求、响应

一、文章概述

        请求方面主要讲,当前端向后端发出请求时,对于不同类型的参数后端都如何接收;对于响应,文章会讲解后端如何向前端响应数据以及如何使返回的数据具有统一的格式。

二、请求

2.1接收简单参数

Controller方法:

启动后端后,我们使用Postman工具来发出请求:

点击send后,后端接收到了我们发送的数据:

        上面的案例中,参数名与形参变量名相同,定义同名的形参即可接收参数,那么当我们定义的形参与参数名不同该怎么办呢?我们需要用到注解@RequestParam和它的属性value:

请求参数名我们保持不变,仅对形参名修改:

我们仍可以接受到正确的参数:

2.2实体参数

        当传递参数较多时,我们如果还一个一个的接受就会有些繁琐,这时我们可以将形参定义为一个实体类。要想完成数据封装,需要遵守如下规则:请求参数名与实体类的属性名相同

我们需要先定义一个实体类:

public class User {private String name;private int age;private int gender;public User() {}public User(String name, int age, int gender) {this.name = name;this.age = age;this.gender = gender;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}/*** 获取* @return gender*/public int getGender() {return gender;}/*** 设置* @param gender*/public void setGender(int gender) {this.gender = gender;}public String toString() {return "User{name = " + name + ", age = " + age + ", gender = " + gender + "}";}
}

Postman请求数据:

Controller方法:

@RestController
public class UserController {@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println("name="+user.getName());System.out.println("age="+user.getAge());System.out.println("gender="+user.getGender());return "OK";}
}

 输出结果如下:

当我们遇到复杂参数时又该怎么办呢?复杂实体参数就是实体中的某些属性也是一个实体对象:

我们给User添加一个address属性,address的实体类定义如下:

public class Address {private String province;private String city;public Address() {}public Address(String province, String city) {this.province = province;this.city = city;}/*** 获取* @return province*/public String getProvince() {return province;}/*** 设置* @param province*/public void setProvince(String province) {this.province = province;}/*** 获取* @return city*/public String getCity() {return city;}/*** 设置* @param city*/public void setCity(String city) {this.city = city;}public String toString() {return "Address{province = " + province + ", city = " + city + "}";}
}

Postman测试数据:

Controller方法:

@RestController
public class RequestController {@RequestMapping("/simpleParam")public String hello(@RequestParam(value="name") String username, int age) {System.out.println(username+"  :  "+age);return "OK";}
}

输出结果如下:

2.3数组集合参数

数组参数

Postman测试数据:

方式一(多个参数同名):

方式二(一个参数赋多个值,值之间用逗号隔开):

Controller方法:

@RestController
public class ArrayController {@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {for(int i=0; i<hobby.length; i++) {System.out.println(hobby[i]+" ");}return "success";}
}

输出结果:

集合参数

Postman中的测试数据与数组参数相同

Controller方法:

@RestController
public class RequestController {//数组集合参数@RequestMapping("/listParam")//@RequestParam也可以写成@RequestParam(value="hobby")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "OK";}
}

2.4日期参数

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

Postman中测试数据:

Controller方法:

@RestController
public class DataController {@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}
}

输出结果:

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

2.5JSON参数

        在前后端进行交互时,如果是比较复杂的参数,前后端通常会使用JSON格式的数据进行传输。 (JSON是开发中最常用的前后端数据交互方式)

Postman中的测试数据:

Controller方法:

@RestController
public class RequestController {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}
}

 输出结果:

2.6路径参数

     这种方式传递参数,也是将参数放在URL后面:

http://localhost:8080/user/1

http://localhost:880/user/1/0

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

传递一个参数

Postman测试数据:

Controller方法:

        参数的前面要加上@PathVariable注解

@RestController
public class RequestController {@RequestMapping("/path/{id}")public String path(@PathVariable Integer id) {System.out.println(id);return "OK";}
}

输出结果:

传递多个参数

Postman测试数据:

Controller方法:

@RestController
public class RequestController {@RequestMapping("/path/{id}/{name}")public String path(@PathVariable Integer id, @PathVariable String name) {System.out.println("id="+id);System.out.println("name="+name);return "OK";}
}

输出结果:

三、响应

3.1@RespondBody注解

        上面的方法中,我们都返回了“OK”,是可以从Postman中看到它的响应数据的:

         其实,要想将数据响应给前端那么是需要@RespondBody注解的,那为什么上面我们并没有写这个注解却可以看到响应的数据?这是因为@RequestController中包含了这个注解,即

@RequestController = @RespondBodey + @RequestController

3.2统一返回格式

        后端返回的值各种各样,前端就比较难以处理这些数据,所以我们可以给它们设置一个统一的响应格式,前端只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码:当前请求是成功,还是失败

  • 状态码信息:给页面的提示信息

  • 返回的数据:给前端响应的数据(字符串、对象、集合)

定义在一个实体类Result来包含以上信息。代码如下:

public class Result {private Integer code;//响应码,1 代表成功; 0 代表失败private String msg;  //响应码 描述字符串private Object data; //返回的数据public Result() { }public Result(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}//增删改 成功响应(不需要给前端返回数据)public static Result success(){return new Result(1,"success",null);}//查询 成功响应(把查询结果做为返回数据响应给前端)public static Result success(Object data){return new Result(1,"success",data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
}

那么我们的Controller方法就可以改为:

@RestController
public class RequestController {@RequestMapping("/path/{id}/{name}")public Result path(@PathVariable Integer id, @PathVariable String name) {System.out.println("id="+id);System.out.println("name="+name);return Result.success("OK");}
}

响应数据如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406735.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法的学习笔记—二叉搜索树的后序遍历序列(牛客JZ33)

&#x1f600;前言 在数据结构与算法的学习中&#xff0c;二叉搜索树&#xff08;BST&#xff09;是一个重要的概念&#xff0c;而后序遍历则是树的遍历方式之一。今天&#xff0c;我们将深入探讨一个经典问题&#xff1a;如何判断一个给定的整数数组是否是某个二叉搜索树的后序…

【Prettier】代码格式化工具Prettier的使用和配置介绍

前言 前段时间&#xff0c;因为项目的prettier的配置和eslint格式检查有些冲突&#xff0c;在其prettier官网和百度了一些配置相关的资料&#xff0c;在此做一些总结&#xff0c;以备不时之需。 Prettier官网 Prettier Prettier 是一种前端代码格式化工具&#xff0c;支持ja…

甘肃旅游服务平台代码--论文pf

TOC springboot422甘肃旅游服务平台代码--论文pf 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0…

Day45 | 99.岛屿数量 深搜 广搜 100.岛屿的最大面积

语言 Java 99.岛屿数量 深搜 广搜 99. 岛屿数量 题目 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可…

【启明智显技术分享】实时操作系统RTOS核心机制与应用

在当今这个对实时性要求日益严苛的嵌入式系统时代&#xff0c;RTOS作为核心软件架构&#xff0c;正扮演着不可或缺的角色。而当我们深入探讨RTOS的广泛应用与优势时&#xff0c;不得不提到启明智显Model系列芯片以其卓越的性能、丰富的外设接口以及对RTOS系统的全面支持&#x…

Qt实现圆型控件的三种方法之子类化控件并重写paintEvent

前言 最近在研究绘制各种形状的控件&#xff0c;这里专门挑出圆形的控件进行记录&#xff0c;其它形状的也大差不差&#xff0c;会了圆形的之后其它的也类似。 正文 这里我挑出Label来进行举例。 子类化 QLabel 并重写 paintEvent 如果需要更复杂的自定义绘制&#xff0c;…

【CSS】使用 CSS 自定义属性(变量)-- var()

自定义属性&#xff08;有时候也被称作CSS 变量或者级联变量&#xff09;是由 CSS 作者定义的&#xff0c;它包含的值可以在整个文档中重复使用。由自定义属性标记设定值&#xff08;比如&#xff1a; --main-color: black;&#xff09;&#xff0c;由 var() 函数来获取值&…

算法全面剖析

算法 查找算法&#xff1a; 顺序查找&#xff1a; 基本思想&#xff1a; 顺序查找也称为线形查找&#xff0c;属于无序查找算法。从数据结构线形表的一端开始&#xff0c;顺序扫描&#xff0c;依次将扫描到的结点关键字与给定值k相比较&#xff0c;若相等则表示查找成功&am…

Nginx--监控

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx的基础监控 进程监控 端口监控 注意&#xff1a; 这两个是必须要加在zabbix监控&#xff0c;加触发器有问题及时告警。 nginx 提供了ngx…

编译linux内核时,让版本号不跟着git变化

文章目录 编译linux内核时&#xff0c;让版本号不跟着git变化现象方法一方法二 编译linux内核时&#xff0c;让版本号不跟着git变化 现象 内核每次重新编译时&#xff0c;uname -r都会跟着变。 4.1.15-00005-g482731e4-dirty 导致报错&#xff0c;modprobe: can’t change …

前端算法 | LeetCode第 70 题爬楼梯问题

目录 流程分析 归纳法分析 为什么是斐波那契数列&#xff1f; 推导过程&#xff1a; 解法1&#xff1a;循环累加计算 解法2&#xff1a;递归计算 解法3&#xff1a;利用数组特性 解法4&#xff1a;利用 JavaScript ES6 新特性 拓展知识&#xff1a;每次可以走 1 步、2…

ClickHouse实时探索与实践 京东云

1 前言 京喜达技术部在社区团购场景下采用JDQFlinkElasticsearch架构来打造实时数据报表。随着业务的发展 Elasticsearch开始暴露出一些弊端&#xff0c;不适合大批量的数据查询&#xff0c;高频次深度分页导出导致ES宕机、不能精确去重统计&#xff0c;多个字段聚合计算时性能…

位运算专题

分享丨【题单】位运算&#xff08;基础/性质/拆位/试填/恒等式/思维&#xff09; - 力扣&#xff08;LeetCode&#xff09; Leetcode 3133. 数组最后一个元素的最小值 我的答案与思路&#xff1a; class Solution { public: // 4 --> (100)2 7 --> (0111)2 // 5 --&g…

怎么让FLV转MP4?建议试试这样做

怎么让FLV转MP4&#xff1f;在数字视频处理的日常中&#xff0c;我们经常会遇到不同格式的视频文件需要相互转换的情况。FLV&#xff08;Flash Video&#xff09;作为一种早期的网络视频格式&#xff0c;虽然在互联网上仍有一定应用&#xff0c;但对比来说&#xff0c;MP4格式更…

vue打包设置 自定义的NODE_ENV

默认NODE_ENV 自定义process.env.NODE_ENV的值_process.node.env的值-CSDN博客 ‌NODE_ENV开发环境下&#xff1a;NODE_ENVdevelopment(默认) 生产环境下&#xff1a;NODE_ENVproduction(默认) NODE_ENV 除了默认的 development 和 production 以外&#xff0c;确实可以自定义…

Apache CloudStack Official Document 翻译节选(八)

关于 Apache CloudStack 的 最佳实践 &#xff08;二&#xff09; 防火墙的设定 Hardware Firewall 部署Apache CloudStack时&#xff0c;建议部署一套防火墙系统已保护Apache CloudStack的云管理服务。在防火墙的选用方面&#xff0c;既可以使用通用防火墙、也可以使用诸如Ju…

树莓派3B运行rasa init和rasa shell遇到的tensorflow报错总结

终于在我的树莓派上安装rasa-1.4.0版本成功&#xff08;见《树莓派智能语音助手之聊天机器人-RASA》&#xff09;。不过&#xff0c;在初始化rasa的时候还是遇到了很多报错&#xff0c;在此总结&#xff0c;供朋友们参考。 1. ModuleNotFoundError: No module named ‘tensorf…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用性能优化一(界面层面)

学完时间&#xff1a;2024年8月22日 学完排名&#xff1a;第1801名 一、介绍 在开发HarmonyOS应用时,优化应用性能是至关重要的。通过/ArkTS高性能编程、减少丢帧卡顿、提升应用启动和响应速度 可以有效提升用户体验。本文将介绍一些优化HarmonyOS应用性能的方法。 一、Ark…

Windows-Server-2016/2019绕过WindowsDefender

当获得了一个webshell的时候&#xff0c;下一步要反弹个shell回来 在尝试了https://github.com/trustedsec/unicorn独角兽失败之后&#xff0c;找到了一篇使用golang将shellcode注入到内存的文章 Bypassing Antivirus with Golang - Gopher it! | JUMPSEC LABS GitHub - brimst…

谷粒商城实战笔记-213-商城业务-认证服务-整合短信验证码服务

文章目录 一&#xff0c;开通阿里云云市场短信服务1&#xff0c;阿里云开通免费短信服务并调试2&#xff0c;整合短信服务2.1 下载HttpUtils代码2.2 开发调用短信服务的组件2.3 测试 HttpUtils代码 这一节主要内容是整合短信发送服务。 一&#xff0c;开通阿里云云市场短信服务…