Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端
文章目录
- 一、概述
- 二、使用
- 1、创建接口@HttpExchange方法
- 2、创建一个在调用方法时执行请求的代理
- 3、方法参数
- 4、返回值
- 5、错误处理
- (1)为RestClient
- (2)为WebClient
- (3)为RestTemplate
- 注意
一、概述
官方文档:https://docs.spring.io/spring-framework/reference/6.1/integration/rest-clients.html#rest-http-interface
Spring6.0推出了新的HTTP接口(类似Openfeign,但是无法做到根据微服务名称进行负载均衡),Spring框架允许您将HTTP服务定义为Java接口@HttpExchange方法。
可以将这样的接口传递给HttpServiceProxyFactory创建通过HTTP客户端执行请求的代理,例如RestClient或者WebClient。
也可以从实现接口@Controller用于服务器请求处理。
二、使用
1、创建接口@HttpExchange方法
interface RepositoryService {@GetExchange("/repos/{owner}/{repo}")Repository getRepository(@PathVariable String owner, @PathVariable String repo);// more HTTP exchange methods...}
2、创建一个在调用方法时执行请求的代理
// 为RestClient
RestClient restClient = RestClient.builder().baseUrl("https://api.github.com/").build();
// 适配
RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
// 构建接口的代理,可以注册为Bean,直接调用
RepositoryService service = factory.createClient(RepositoryService.class);
// 为WebClient
WebClient webClient = WebClient.builder().baseUrl("https://api.github.com/").build();
WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();RepositoryService service = factory.createClient(RepositoryService.class);
// 为RestTemplate
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory("https://api.github.com/"));
RestTemplateAdapter adapter = RestTemplateAdapter.create(restTemplate);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();RepositoryService service = factory.createClient(RepositoryService.class);
// @HttpExchange在类型级别受支持,它适用于所有方法
@HttpExchange(url = "/repos/{owner}/{repo}", accept = "application/vnd.github.v3+json")
interface RepositoryService {@GetExchangeRepository getRepository(@PathVariable String owner, @PathVariable String repo);@PatchExchange(contentType = MediaType.APPLICATION_FORM_URLENCODED_VALUE)void updateRepository(@PathVariable String owner, @PathVariable String repo,@RequestParam String name, @RequestParam String description, @RequestParam String homepage);}
3、方法参数
带注解的HTTP交换方法支持具有以下方法参数的灵活方法签名

4、返回值
支持的返回值取决于底层客户端。
客户适应HttpExchangeAdapter诸如RestClient和RestTemplate支持同步返回值:

客户响应ReactorHttpExchangeAdapter诸如WebClient,支持上述所有功能以及反应性变体。下表显示了反应器类型,但是也可以使用通过ReactiveAdapterRegistry:

默认情况下,同步返回值与ReactorHttpExchangeAdapter取决于底层HTTP客户端的配置。您可以设置一个blockTimeout值,但是我们建议依赖底层HTTP客户机的超时设置,它在较低的级别上运行并提供更多的控制。
5、错误处理
要定制错误响应处理,您需要配置底层HTTP客户端。
(1)为RestClient
默认情况下,RestClient抛出RestClientException对于4xx和5xx HTTP状态代码。要对此进行自定义,请注册一个适用于通过客户端执行的所有响应的响应状态处理程序:
RestClient restClient = RestClient.builder().defaultStatusHandler(HttpStatusCode::isError, (request, response) -> ...).build();RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
有关更多详细信息和选项(如取消错误状态代码),请参见的JavadocdefaultStatusHandler在RestClient.Builder。
(2)为WebClient
默认情况下,WebClient抛出WebClientResponseException对于4xx和5xx HTTP状态代码。要对此进行自定义,请注册一个适用于通过客户端执行的所有响应的响应状态处理程序:
WebClient webClient = WebClient.builder().defaultStatusHandler(HttpStatusCode::isError, resp -> ...).build();WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(adapter).build();
(3)为RestTemplate
默认情况下,RestTemplate抛出RestClientException对于4xx和5xx HTTP状态代码。要对此进行自定义,请注册一个适用于通过客户端执行的所有响应的错误处理程序:
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(myErrorHandler);RestTemplateAdapter adapter = RestTemplateAdapter.create(restTemplate);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
有关更多详细信息和选项,请参见的JavadocsetErrorHandler在RestTemplate和ResponseErrorHandler等级制度。
注意
- HttpEntity标题和正文必须提供给RestClient通过
headers(Consumer<HttpHeaders>)和body(Object). - RequestEntity方法、URI、标头和正文必须提供给RestClient通过method(HttpMethod), uri(URI),
headers(Consumer<HttpHeaders>)和body(Object).
相关文章:
Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端
文章目录 一、概述二、使用1、创建接口HttpExchange方法2、创建一个在调用方法时执行请求的代理3、方法参数4、返回值5、错误处理(1)为RestClient(2)为WebClient(3)为RestTemplate 注意 一、概述 官方文档…...
springboot医院信管系统
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序
接下来编译 LED 驱动,该驱动用于在基于华为设备框架(HDF)的系统中控制 LED 灯的开关,完整代码如下所示: 更多内容可以关注:迅为RK3568开发板篇OpenHarmony...
[javaWeb]初识Web
将该图片在浏览器中打印出来 代码: <html> <head> <title>HTML初识</title> </head> <body> <h1>猫猫</h1> <img src "img/1.jpg"> </body> &l…...
复健第二天之[MoeCTF 2022]baby_file
打开题目在线环境可以看到: 感觉要用伪协议去求,但是我们并不知道flag的位置,这里我选择用dirsearch去扫一下: 最像的应该就是flag.php了 于是就构建payload: **?filephp://filter/convert.base64-encode/resource…...
uniapp 微信小程序 editor 富文本编辑器
<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…...
SparkSQL函数
文章目录 1. SparkSQL函数概述2. SparkSQL内置函数2.1 常用内置函数分类2.2 常用数组函数2.2.1 array()函数1. 定义2. 语法3. 示例 2.3 常用日期与时间戳函数2.4 常见聚合函数2.5 常见窗口函数 3. SparkSQL自定义函数3.1 自定义函数分类3.2 自定义函数案例演示 1. SparkSQL函数…...
从零开始学数据库 day2 DML
从零开始学数据库:DML操作详解 在今天的数字化时代,数据库的使用已经成为了各行各业的必备技能。无论你是想开发一个简单的应用,还是想要管理复杂的数据,掌握数据库的基本操作都是至关重要的。在这篇博客中,我们将专注…...
电脑换固态硬盘
参考: https://baijiahao.baidu.com/s?id1724377623311611247 一、根据尺寸和缺口可以分为以下几种: 1、M.2 NVME协议的固态 大部分笔记本是22x42MM和22x80MM nvme固态。 在京东直接搜: M.2 2242 M.2 2280 2、msata接口固态 3、NGFF M.…...
【大数据】机器学习------支持向量机(SVM)
支持向量机的基本概念和数学公式: 1. 线性可分的支持向量机 对于线性可分的数据集 ,其中(x_i \in R^d) 是特征向量 是类别标签,目标是找到一个超平面 ,使得对于所有 的样本 ,对于所有(y_i -1) 的样本,…...
Android系统开发(八):从麦克风到扬声器,音频HAL框架的奇妙之旅
引言:音浪太强,我稳如老 HAL! 如果有一天你的耳机里传来的不是《咱们屯里人》,而是金属碰撞般的杂音,那你可能已经感受到了 Android 音频硬件抽象层 (HAL) 出问题的后果!在 Android 音频架构中,…...
Golang Gin系列-2:搭建Gin 框架环境
开始网络开发之旅通常是从选择合适的工具开始的。在这个全面的指南中,我们将引导你完成安装Go编程语言和Gin框架的过程,Gin框架是Go的轻量级和灵活的web框架。从设置Go工作空间到将Gin整合到项目中,本指南是高效而强大的web开发路线图。 安装…...
FGC_grasp复现
复现FGC_grasp 环境配置数据集准备RuntimeError: CUDA error: invalid device ordinal 问题的解决方案raise BadZipFile("File is not a zip file") zipfile.BadZipFile: File is not a zip file问题的解决方案加载数据集时总是被kill然后服务器也卡住了动不了问题的…...
实力认证 | 海云安入选《信创安全产品及服务购买决策参考》
近日,国内知名安全调研机构GoUpSec发布了2024年中国网络安全行业《信创安全产品及服务购买决策参考》,报告从产品特点、产品优势、成功案例、安全策略等维度对各厂商信创安全产品及服务进行调研了解。 海云安凭借AI大模型技术在信创安全领域中的创新应用…...
Avalonia系列文章之小试牛刀
最近有朋友反馈,能否分享一下Avalonia相关的文章,于是就抽空学习了一下,发现Avalonia真的是一款非常不错的UI框架,值得花时间认真学习一下,于是边学习边记录,整理成文,分享给大家,希…...
中国数字安全产业年度报告(2024)
数字安全是指,在全球数字化背景下,合理控制个人、组织、国家在各种活动中面临的数字风险,保障数字社会可持续发展的政策法规、管理措施、技术方法等安全手段的总和。 数字安全领域可从三个方面对应新质生产力的三大内涵:一是基于大型语言模型…...
LabVIEW桥接传感器配置与数据采集
该LabVIEW程序主要用于配置桥接传感器并进行数据采集,涉及电压激励、桥接电阻、采样设置及错误处理。第一个VI("Auto Cleanup")用于自动清理资源,建议保留以确保系统稳定运行。 以下是对图像中各个组件的详细解释&#…...
简明docker快速入门并实践方法
简明docker快速入门并实践方法 前言:1. 什么是Docker?2. Docker的基本概念3. 安装配置Docker4. Docker基本命令:5. 简单实践:拉取Nginx镜像-自定义配置-推送镜像步骤 1:拉取Nginx镜像步骤 1.5(可选…...
《MambaIR:一种基于状态空间模型的简单图像修复基线方法》学习笔记
paper:2402.15648 目录 摘要 一、引言 1、模型性能的提升依赖于网络感受野的扩大: 2、全局感受野和高效计算之间存在固有矛盾: 3、改进版 Mamba的巨大潜力 4、Mamba 在图像修复任务中仍面临以下挑战: 5、方法 6、主要贡献…...
链式前向星的写法
【图论02】动画说图的三种保存方式 降低理解门槛 邻接表 链式前向星 邻接矩阵_哔哩哔哩_bilibili 杭电ACM刘老师-算法入门培训-第12讲-拓扑排序及链式前向星_哔哩哔哩_bilibili 图论003链式前向星_哔哩哔哩_bilibili(链式前向星的遍历) head数组的下标…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
