07 SB3之@HttpExchange(TBD)
HttpExchange是SpringBoot3的新特性.
Spring Boot3 提供了新的 HTTP 的访问能力,封装了Http底层细节. 通过接口简化 HTTP远程访问,类似 Feign 功能。
SpringBoot 中定义接口提供 HTTP 服务 --> 框架生成的代理对象实现此接口 --> 框架生成的代理对象实现 HTTP 的远程访问。
1.1.1 WebClient
- 非阻塞. 阻塞和非阻塞针对被调度者,被调度者收到请求后,做完请求任务之后才给出反馈就是阻塞,收到请求之后马上给
出反馈然后去做事情,就是非阻塞 - 异步请求. 异步和同步针对调度者,调用者发送请求,如果等待对方回应之后才去做其他事情,就是同步,如果发送请求之后不
等着对方回应就去做其他事情就是异步 - 它的响应式编程的基于 Reactor
1.1.2 Http接口的参数列表和返回值
作为 HTTP 服务接口中的方法允许使用的参数列表

作为 HTTP 服务接口中的方法一般可选的返回值
- void、Mono:执行请求并丢弃响应内容。
- HttpHeaders、Mono: 执行请求,丢弃响应体,返回响应头。
- 、Mono:执行请求,并将响应体解码为所声明的类型。
- 、Flux:执行请求,并将响应体解码为所声明类型的数据流。
- ResponseEntity、Mono<ResponseEntity>:执行请求,丢弃响应体,并返回一个包含状态和响应头的
ResponseEntity。 - ResponseEntity、Mono<ResponseEntity>:执行请求,并返回一个包含状态、响应头和解码后的响应体 ResponseEntity。
Mono<ResponseEntity<Flux>:执行请求,并返回一个包含状态、响应头和解码后的响应体 ResponseEntity。
1.2 实例
1.2.1
安装Gsonformat
使用方式: 建好实体类以后, 在类中右键generate - Gsonformat , 然后复制JSON进去即可
1.2.2 需求
需求:
访问 https://jsonplaceholder.typicode.com/ 提供的 todos 服务。
并基于 RESTful 风格,添加新的 todo,修改 todo 中的 title,查询某个 todo。
简单来说, 以往都是我们的电脑充当服务器, 自己编写后端代码, 然后自己在网页模拟发送请求来调用后端服务.
现在我们直接使用在后端中发送请求, 远程调用别人的服务(CRUD数据), 由他人提供服务器.
一个最大的区别就是将解析地址的操作搬到了service层

直接在浏览器中访问该网址, 可以看到里面有许多JSON数据, 每一个都是一个todo, 现在的目标就是操作这些todo.
1.2.3 添加依赖

多添加一个依赖Reactive Web, 以使用WebClient(HttpExchange就封装了WebClient)
1.2.4 实体类
package com.sunsplanter.httpserivce.pojo;import lombok.Data;/*** 根据 https://jsonplaceholder.typicode.com/todos/1 的结构创建的*/
@Data
public class Todo {private Integer userId;private int id;private String title;private boolean completed;}
1.2.5 声明服务接口
//将controller层的工作搬到了服务层
public interface TodoService {//一个方法就是一个远程服务(远程调用)@GetExchange("/todos/{id}")Todo getTodoById(@PathVariable Integer id);@PostExchange(value = "/todos",accept = MediaType.APPLICATION_JSON_VALUE)Todo createTodo(@RequestBody Todo newTodo);@PutExchange("/todos/{id}")ResponseEntity<Todo> modifyTodo(@PathVariable Integer id,@RequestBody Todotodo);@PatchExchange("/todos/{id}")HttpHeaders pathRequest(@PathVariable Integer id, @RequestParam String title);@DeleteExchange("/todos/{id}")void removeTodo(@PathVariable Integer id);
}
1.2.6 创建 HTTP 服务代理对象
package com.sunsplanter.httpserivce.config;@Configuration(proxyBeanMethods = false)
public class HTTPConfig {//每个实体类都要创建一个代理对象@Beanpublic TodoService requestService(){//创建服务接口的代理对象,基于WebClientWebClient webClient =WebClient.builder().baseUrl("https://jsonplaceholder.typicode.com/").build();HttpServiceProxyFactory proxyFactory =HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient)).build();return proxyFactory.createClient(TodoService.class);}
}
1.2.7 单元测试
package com.sunsplanter.httpserivce;@SpringBootTest
class HttpServiceApplicationTests {@Resourceprivate TodoService requestService;@Testvoid testQuery() {Todo todo = requestService.getTodoById(1);System.out.println("todo = " + todo);}@Testvoid testCreateTodo() {Todo todo = new Todo();todo.setId(1001);todo.setCompleted(true);todo.setTitle("录制视频");todo.setUserId(5001);Todo save = requestService.createTodo(todo);System.out.println(save);}@Testvoid testModifyTitle() {
//org.springframework.http.HttpHeadersHttpHeaders entries = requestService.pathRequest(5, "homework");entries.forEach((name, vals) -> {System.out.println(name);vals.forEach(System.out::println);System.out.println("=========================");});}@Testvoid testModifyTodo() {Todo todo = new Todo();todo.setCompleted(true);todo.setTitle("录制视频!!!");todo.setUserId(5002);ResponseEntity<Todo> result = requestService.modifyTodo(2, todo);HttpStatusCode statusCode = result.getStatusCode();HttpHeaders headers = result.getHeaders();Todo modifyTodo = result.getBody();System.out.println("statusCode = " + statusCode);System.out.println("headers = " + headers);System.out.println("modifyTodo = " + modifyTodo);}@Testvoid testRemove() {requestService.removeTodo(2);}
}
但是,没有搞太清楚原理.
例如: 为什么在接口中是用Get方法?为什么是路径传参?是https://jsonplaceholder.typicode.com/todos那边规定的吗?
尝试更改为param传参失败.
@GetExchange("/todos/{id}")Todo getTodoById(@PathVariable Integer id);
相关文章:
07 SB3之@HttpExchange(TBD)
HttpExchange是SpringBoot3的新特性. Spring Boot3 提供了新的 HTTP 的访问能力,封装了Http底层细节. 通过接口简化 HTTP远程访问,类似 Feign 功能。 SpringBoot 中定义接口提供 HTTP 服务 --> 框架生成的代理对象实现此接口 --> 框架生成的代理…...
Redis数据淘汰策略
Redis作为一种高性能的键值存储数据库,通常用于缓存和提高数据检索速度。然而,由于内存资源有限,当内存不足以容纳所有数据时,Redis就需要采取一些策略来删除部分数据,以确保新的数据能够被写入。这就引入了数据淘汰策…...
Git的一些基本操作
初始git 我们给出下面的一个场景,在大学里,一些老师在我们做完实验之后喜欢让我们交实验报告,假设我们有一个比较追求完美的老师和一个勤奋的学生,这个学生叫做小帅,那天小帅桑勤奋的完成实验报告,在第二天…...
Spring Boot中异步线程池@Async
很多业务场景需要使用异步去完成,比如:发送短信通知。要完成异步操作一般有两种: 1、消息队列MQ 2、线程池处理。 我们来看看Spring框架中如何去使用线程池来完成异步操作,以及分析背后的原理。 一. Spring异步线程池的接口类 …...
ArcGIS学习(五)坐标系-2
3.不同基准面坐标系之间的转换 在上一关中,我们学习了ArcGIS中的投影(投影栅格)工具,并以"WGS1984地理坐标系与WGS1984的UTM投影坐标系的转换”为例进行讲解。 "WGS1984地理坐标系与WGS1984的UTM投影坐标系的转换”代表的是同一个基准面下的两个坐标的转换。 …...
2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块
044_http模块_创建HTTP服务端 hello,大家好,那这个小节我们来使用 nodejs 创建一个 http 的服务,有了这个 http 服务之后,我们就可以处理浏览器所发送过来的请求,并且还可以给这个浏览器返回响应。 顺便说一下&#x…...
sklearn.preprocessing 标准化、归一化、正则化
文章目录 数据标准化的原因作用归一化最大最小归一化针对规模化有异常的数据标准化线性比例标准化法log函数标准化法正则化Normalization标准化的意义数据标准化的原因 某些算法要求样本具有零均值和单位方差;需要消除样本不同属性具有不同量级时的影响: ① 数量级的差异将导…...
Windows系统编程(一) 文件与目录操作
以下程序需要包含<Windows.h>头文件 创建打开文件 HANDLE hFile CreateFile("D:\\rkvir.ini", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 此处打开文件,参数依次 已有文件的路径,注意…...
6-2、T型加减速计算简化【51单片机+L298N步进电机系列教程】
↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍简化T型加减速计算过程,使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 根据上一节内容已知 常用的晶振大小…...
配置Jenkins自动构建打包项目
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 需求说明 1、给A项目配置jenkins每2小时无条件自动构建一次,无论是否有代码提交。 2、给B项目配置jenkins每15分钟检…...
进阶C语言-通讯录的实现
通讯录 🎈1.设计要求🎈2.程序实现🔭2.1打印菜单及初始化通讯录🔭2.2显示所有联系人🔭2.3查找指定的联系人🔭2.4删除指定的联系人🔭2.5查找指定的联系人🔭2.6修改指定联系人🔭2.7按照年龄排序(以此为例)🎈3.全部源码以及实现🎈1.设计要求 🌞通过前面…...
STM32单片机的基本原理与应用(七)
超声波测距实验 基本原理 超声波测距实验是STM32单片机通过控制HC-SR04超声波模块,使其发送超声波,遇到物体反射回超声波来实现距离测量,其原理就是在发射超声波到接收超声波会有一段时间,而超声波在空气中传播的速度为声速&…...
LLM应用开发与落地:使用gradio十分钟搭建聊天UI
一、背景 如果你是做LLM应用开发的,特别是做后端开发,你一定会遇到怎么快速写一个聊天UI界面来调试prompt或agent的问题。这时候的你可能在苦恼中,毕竟react.js, next.js, css, html也不是每个人都那么熟练,对吧?即使…...
智慧城市:打造低碳未来,引领城市数字化转型新篇章
在“万物皆可数字化”的新时代浪潮下,智慧城市作为未来城市发展的先锋方向,正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志,更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…...
ChatGPT之制作短视频
引言 今天带来了如何使用 ChatGPT和剪映来制作简单的短视频教程,在这其中 ChatGPT的作用主要是帮我们生成文案,剪映的功能就是根据文案自动生成视频,并配上一些图片、动画、字幕和解说。 ChatGPT生成文案 首先,我们需要使用提示…...
k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(二)
三、简配版集群,适用于demo环境 1.集群架构设计 主机名角色配置(核数,内存,磁盘)MasterRKE,controlplane,etcd,worker,rancher-master2C 8G 40GSlaver1controlplane,worker,rancher-master2C 8G 40GSlaver2controlplane,worker,rancher-mas…...
智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码)
文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码) 源码设计 clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000;...
mysql如何备份某些库的某些表
MySQL备份数据库 mysql如何备份某些库的某些表 要备份某个库里的部分表,该如何操作? 例如:要备份db01库里的20张表,表很多又不想备份整个库 或者要备份多个库里的不同表,又如何操作? 例如:备份…...
C++类和对象入门(三)
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 前言 在c中,类型分为两类,一类是内置类型,另一类是自定义类型。 1.内置类型…...
【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一)
文章目录 1. 前言2. MyBackendId分配机制2.1 全局变量MyBackendId2.2 共享缓存无效内存段(shared inval buffer)2.2.1 shmInvalBuffer缓冲区2.2.2 shmInvalBuffer初始化1. 前言 MyBackendId的数据类型是BackendId(backendid.h src/include/storage),它表示“当前活动的后…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
