请求响应(学习笔记)
请求响应
文章目录
- 请求响应
- 请求
- Postman
- 简单参数
- 实体参数
- 数组集合参数
- 数组参数
- 集合参数
- 日期参数
- JSON参数
- 路径参数
- 响应
- 响应数据
- 统一响应结果
- 分层解耦
- 三层架构
- 分层解耦
- IOC & DI 入门
- IOC详解
- DI详解
请求响应:
- 请求(HttpServeltRequest):获取请求数据
- 响应(HttpServletResponse): 设置响应数据
- BS架构:Browser/Server 浏览器/服务器 架构模式,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。(维护方便,体验一般)
- CS架构:Client/Server 客户端/服务端架构模式。(开发、维护麻烦,体验不错)
请求
Postman
当前最主流的开发模式:前后端分离开发。
由于前后端分离,后端开发没有前端页面,浏览器发送的请求都是get请求
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用:常用于进行接口测试。
简单参数
-
原始方式
在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取
package com.itheima;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@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+":"+age);return "OK";}
}//使用postman发送Get请求
//http://localhost:8080/simpleParam?name=Tom&age=10
//ok
-
SpringBoot方式
简单参数:参数名与形参变量名相同,定义形参即可接收参数
//SpringBoot方式@RequestMapping("simpleParam")public String simpleParam(String name,Integer age) {System.out.println(name+":"+age);return"OK";}
简单参数:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射
@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name ="name")String username,Integer age) {System.out.println(username+":"+age);return "OK";}//使用postname发送GET请求
//http://localhost:8080/simpleParam?name=ZAY&age=3
//
@RequestParm 中的required默认属性为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false
实体参数
当参数需要传输过多,使用简单参数就会变得繁琐,可以将所有的参数封装到一个实体类之中
- 简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可
@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "OK";}public class User{private String name;private Integer age;public User(String name,Integer age){this.name = name;this.age = age;}public User(){}public String getName(){return this.name;}public void setName(String name){this.name = name;}public Integer getAge(){return age;}public void setAge(Integer age){this.age = age;}
}
- 复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
public class Address {private String province;private String city;public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}public class User {private String name;private Integer age;private Address address;public User(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public User() {}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}@RequestMapping("/complexPojo")
public String complexPojo(User user){Systm.out.println(user);return "OK";
}//使用Postman发送GET请求
//http://localhost:8080/complexPojo?name=ZAY&age=10&address.province=北京&address.city=上海
//console返回OK
数组集合参数
数组参数
数组参数:请求参数名与形参组名称相同且请求参数为多个,定义数组类型形参即可接收参数
@RequestMapping("/arrayParam")
public String arrayParam(String []hobby){System.out.println(Arrays,toString(hobby));return "OK";
}//使用Postman发送GET请求
//http://localhost:8080/arrayParam?hobby=game&hobby=java&hobby=sing//[game, java, sing]
集合参数
集合参数:请求参数名与形参集合名称相同且请求参数为多个,通过@RequestParam绑定参数关系
@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}//使用Postman发送GET请求
//http://localhost:8080/listParam?hobby=game&hobby=java&hobby=sing//[game, java, sing]
日期参数
日期参数:使用@DateTimeFormat注解完成日期参数格式转换
//日期时间参数@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}
//使用Postman发送GET请求
//http://localhost:8080/dateParam?updateTime=2022-12-12 10:00:05//2022-12-12T10:00:05
JSON参数
Json参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用**@RequestBody**表示
@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}
//使用Postman发送POST请求
//http://localhost:8080/jsonParam{"name":"ZAY","age":18,"address":{"province":"安徽","city":"合肥"}
}//User{name='ZAY', age=18, address=Address{province='安徽', city='合肥'}}
路径参数
路径参数:通过请求URL直接传递参数,使用{…}来表示该路径参数,需要使用**@PathVariable**获取路径参数
//路径参数@RequestMapping("/path/{id}")public String path(@PathVariable Integer id) {System.out.println(id);return "OK";}//使用Postman发送GET请求
//http://localhost:8080/path/10086
//10086
@RequestMapping("/path/{id}/{name}")
public String path(@PathVariable Integer id, @PathVariable String name) {System.out.println(id +":"+name);return "OK";
}//使用Postman发送请求
//http://localhost:8080/path/1/ITCAST
//1:ITCAST
响应
响应数据
@ResponseBody
- 类型:方法注解、注解类
- 位置:Controller方法上/类上
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
- 说明:@RestController = @Controller + @ResponseBody
统一响应结果
public class Result{//响应码 1,成功 / 0,失败private Integer code;//提示信息private String msg;//返回数据private Object data;
}
{"code":"1","msg":"操作成功","data":...
}
统一响应结果
package com.itheima.pojo;/*** 统一响应结果封装类*/
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic 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(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);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}
分层解耦
三层架构
三层架构: Controller(接收请求、响应数据)、Service(逻辑处理)、Dao(数据访问)
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- service:业务逻辑层,处理具体的业务逻辑
- dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查
//controller层
@RestController
public class EmpController{private EmpService empService = new EmpServiceA();@RequestMapping("/listEmp")public Result list(){//调用service 获取数据List<Emp> empList = empService.listEmp();//组装数据并返回return Result.success(empList);}
}
//dao层
public class EmpDaoA implements EmpDao{public List<Emp>listEmp(){//加载emp.xml 解析emp.xml中的数据String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp> empList = XmlParesrUtiles.parse(file,Emp.class);return empList;}
}
//service层
public class EmpServiceA implements EmpService{private EmpDao empDao = new EmpDaoA();pulic List<Emp> listEmp(){//调用dao层 获取数据List<Emp> empList = empDao.listEmp();//对员工信息中的gender job字段进行处理empList.stream().forEach(emp ->{if('1'.equals(gender)){emp.setGender('男');}else if("2".equlas(gender)){emp.setGender('女');}});return empList;}
}
分层解耦
- 内聚:软件中各个模块内部的功能联系
- 耦合:衡量软件中各个层/模块之间的依赖、关联的成都
- 软件设计原则:高内聚、低耦合
控制反转:Inversion Of Control 简称IOC。对象的串讲控制权由程序自身转移到外部(容器),这种思想称为控制反转
依赖注入:Dependency Injection 简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为bean
IOC & DI 入门
- Service层 及 Dao层的实现类,交给IOC容器管理
@Component
public class EmpDaoA implements EmpDao{public List<Emp> listEmp(){//从文件中查询数据String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp> empList = XmpParserUtils.parse(file,Emp.class);return empList;}
}
@Component
public class EmpServiceA implements EmpService{private EmpDao empDao;public List<Emp>listEmp(){//调用dao层 查询数据List<Emp> empList = empDao.listEmp();}
}
- 为Controller及Service注入运行时,依赖的对象
@RestController
public class EmpController{@Autowiredprivate EmpService empService;@RequestMapping("/listEmp")public Result listEmp() throws Exception{List<Emp> empList = empService.listEmp();return Resultsuccess(empList);}
}
@Component
public class EmpServiceA implements EmpService{@Autowiredprivate EmpDao empDao;public List<Emp> listEmp(){//调用dao层 查询数据List<Emp>empList = empDao.listEmp();}
}
- 运行测试
@Component //将当前类交给IOC容器管理,称为IOC容器中的bean(对象)
@Autowired //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量-依赖注入
IOC详解
Bean的声明:
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一
| 注解 | 说明 | 位置 |
|---|---|---|
| @Component | 声明bean的基础注解 | 不属于以下三类,用此注解 |
| @Controller | @Component的衍生注解 | 标注在控制器类上 |
| @Service | @Component的衍生注解 | 标注在业务类上 |
| @Repository | @Component的衍生注解 | 标注在数据访问类上 |
注意事项
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为雷鸣的首字母小写
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller
Bean组件扫描
- 前面声明bean的四大注解,想要生效,还需要被组件扫描注解@ComponentScan扫描
- @ComponentScan注解虽然没有显式配置,但是时间上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
DI详解
Bean注入:
- @Autowired注解默认是按照类型进行,如果存在多个相同类型的bean,会报错
- 通过以下几种方案解决:
- @Primary
- @Qualifiler
- @Resource
相关文章:
请求响应(学习笔记)
请求响应 文章目录 请求响应请求Postman简单参数实体参数数组集合参数数组参数集合参数 日期参数JSON参数路径参数 响应响应数据统一响应结果 分层解耦三层架构分层解耦IOC & DI 入门IOC详解DI详解 请求响应: 请求(HttpServeltRequest):获取请求数据…...
JavaScript核心语法(5)
这篇文章讲一下ES6中的核心语法:扩展运算符和模块化。 目录 1.扩展运算符 数组中的扩展运算符 基本用法 合并数组 对象中的扩展运算符 基本用法 合并对象 与解构赋值结合使用 数组解构中的剩余元素 对象解构中的剩余属性 2.模块化 基本概念 1.扩展运算符…...
2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现
目录 第一题握手,这个直接从49累加到7即可,没啥难度,后面7个不握手就好了,没啥讲的,(然后第二个题填空好难,嘻嘻不会) 第三题.好数编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…...
MongoDB 和 Redis 是两种不同类型的数据库比较
MongoDB 和 Redis 是两种不同类型的数据库,设计目标和应用场景各有侧重,因此性能对比需要结合具体需求场景进行评估。 1. MongoDB 性能特点 类型: 文档型数据库(NoSQL)。适合场景: 复杂查询:支持丰富的查询语法和索引…...
CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读
abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同,(Radford et al., 2021) 引入了一种新范式,该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中,通…...
Spring Boot 开发环境搭建详解
下面安装spring boot的详细步骤,涵盖了从安装 JDK 和 Maven 到创建和运行一个 Spring Boot 项目的全过程。 文章目录 1. 安装 JDK步骤 1.1:下载 JDK步骤 1.2:安装 JDK步骤 1.3:配置环境变量 2. 安装 Maven步骤 2.1:下载…...
网络安全中的数据科学如何重新定义安全实践?
组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…...
安装数据库客户端工具
如果没有勾选下面的,可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件,找到数据库,并刷新...
GoogleTest做单元测试
目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了,解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是,…...
深入解析 EasyExcel 组件原理与应用
✨深入解析 EasyExcel 组件原理与应用✨ 官方:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中,处理 Excel 文件的导入导出是极为常见的需求。 今天,咱们就一起来深入了解一款非常实用的操作 Exce…...
JSON数据转化为Excel及数据处理分析
在现代数据处理中,JSON(JavaScript Object Notation)因其轻量级和易于人阅读的特点而被广泛使用。然而,有时我们需要将这些JSON数据转化为Excel格式以便于进一步的分析和处理。本文将介绍如何将JSON数据转化为Excel文件࿰…...
(计算机网络)期末
计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据(串行输入) 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前,要对信源进行一个编码,收到信息之后要进行一个…...
【AI技术赋能有限元分析应用实践】将FEniCS 软件安装在Ubuntu22.04
FEniCS 完整介绍 FEniCS 是一个开源的计算工具包,专门用于解决偏微分方程(PDE)的建模和求解。它以灵活的数学抽象和高效的计算性能著称,可以让用户使用高层次的数学表达来定义问题,而无需关注底层的数值实现细节。 具体来看,FEniCS 是一个开源的高性能计算工具包,用于…...
快速识别模型:simple_ocr,部署教程
快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型:检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…...
【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作
文章目录 环境配置:搭建开发环境的基础步骤2.1 安装MySQL数据库2.2 配置C/C开发环境2.3 下载并安装MySQL Connector/C 基础操作:实现C/C与MySQL的基本交互3.1 建立数据库连接3.2 执行SQL语句3.3 处理查询结果 进阶技巧:提升数据库操作效率与安…...
C#中面试的常见问题005
1、重载和重写 重载(Overloading) 重载是指在同一个类中定义多个同名方法,但参数列表不同(参数的数量、类型或顺序不同)。返回类型可以相同也可以不同。重载方法允许你根据传入的参数类型和数量来调用不同的方法。 …...
使用Redis生成全局唯一id
为了生成一个符合要求的分布式全局ID,我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成: 符号位(1 bit):始终为0,表示正数。时间戳(31 bit):表示从某个起始…...
pnpm:包管理的新星,平替 npm 和 yarn
pnpm,一个老牌的 node.js 包管理器,支持 npm 的所有功能,完全足以用来替代 npm。它采用全局存储,每个项目内部使用了硬链接,所以很省空间,安装速度快。 本文介绍下 pnpm 的基本概念,安装、…...
Android调起系统分享图片到其他应用
Android调起系统分享图片到其他应用 有时候分享不想接第三方的,其实如果你的分享要求不是很高,调系统的分享也是可以的。 一、思路: 用intent.action Intent.ACTION_SEND 二、效果图: 三、关键代码: //这个是分享…...
详解Qt QBuffer
文章目录 **QBuffer 的详解****前言****QBuffer 是什么?****QBuffer 的主要用途****构造函数****主要成员函数详解****1. open()****原型:****作用:****参数:****返回值:****示例代码:** **2. write()****原…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
