远程访问@HttpExchange

提示:这是SpringBoot3以上的新特性。

远程访问@HttpExchange

  • 一、webClient
  • 二、Http 服务接口的方法定义
  • 三、声明式 HTTP 远程服务
    • 1.组合使用注解
    • 2.使用单个注解
    • 3.定制 HTTP 请求服务
  • 四、总结
    • 1.部分方法过时
    • 2.过时的方法详解


  • 远程访问是开发的常用技术,一个应用能够访问其他应用的功能。Spring Boot 提供了多种远程访问技术。基于 HTTP 协议的远程访问是支持最广泛的。Spring Boot3 提供了新的 HTTP 访问能力,通过接口简化 HTTP 远程访问,类似 Feign 功能。Spring 包装了底层 HTTP 客户的访问细节
  • Spring Boot 中定义接口提供 HTTP 服务生成的代理对象实现此接口代理对象实现 HTTP 的远程访问。

一、webClient

  • 我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,RestTemplate 是 Spring3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。Spring 官方在 Spring5 中引入了 WebClient 作为异步非阻塞式 HTTP 客户端。有如下的特点:
    • 非阻塞,异步请求
    • 它的响应式编程是基于 Reactor
    • 高并发,硬件资源少
    • 支持 Java8 lambdas 函数函数式编程
  • 什么是同步和异步
    • 异步和同步针对调用者,调用者发送请求,如果等待对方回应之后才去做其他事情,就是同步,如果发送请求之后不等待对方回应就去做其他事情就是异步。
  • 什么是阻塞和非阻塞
    • 阻塞和非阻塞针对被调度者,被调度者收到请求后,做完请求任务之后才给出反馈就是阻塞,收到请求之后马上给出反馈然后去做其他事情,就是非阻塞。

二、Http 服务接口的方法定义

  • @HttpExchange 注解用于声明接口作为 HTTP 远程服务。在方法、类级别使用。通过注解属性以及方法的参数设置 HTTP 请求的细节。
    • @GetExchange 用于 HTTP GET 请求。一般用于获取数据。
    • @PostExchange 用于 HTTP POST 请求。一般用于提交数据。
    • @PutExchange 用于 HTTP PUT 请求。一般用于修改数据。
    • @PatchExchange 用于 HTTP PATCH 请求。
    • @DelectExchange 用于 HTTP DELETE 请求。一般用于删除数据。
  • 作为 HTTP 服务接口中的方法允许使用的参数
    参数说明
    URI设置请求的url,覆盖注解的url属性
    HttpMethod请求方式,覆盖注解的method属性
    @RequestHeader添加到请求中header。 参数类型可以为Map, MultiValueMap,单个值 或者 Collection
    @PathVariableurl中的占位符,参数可为单个值或Map
    @RequestBody请求体,参数是对象
    @RequestParam请求参数,单个值或Map, MultiValueMap,Collection
    @RequestPart发送文件时使用
    @CookieValue向请求中添加cookie
  • 接口中方法返回值
    返回值类型说明
    void执行请求,无需解析应答
    HttpHeaders存储 response 应答的 header 信息
    对象解析应答结果,转为声明的类型对象
    ResponseEntity<void>、ResonseEntity<T>解析应答内容,得到 ResponseEntity,从 ResponseEntity 可以获取 http 应答码、header、body等内容

三、声明式 HTTP 远程服务

  • 使用一个免费的、24小时在线的 Rest Http 服务。===> https://jsonplaceholder.typicode.com/,其提供的 comments 服务。基于 RESTful 风格,添加新的 comments,修改 comments,查询某个具体的 comments。

1.组合使用注解

  • @HttpExchange,@HttpExchange等注解可以组合使用。
  • 类级别的 url 和方法级别的 url 组合在一起就是最后请求的 url 地址。
  • ① 引入依赖
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    
  • ② 编写 comment 数据类
    public class Comment {private Integer postId;private Integer id;private String name;private String email;private String body;
    //构造方法、setter和getter方法、toString方法
    }
    
  • ③ 声明服务接口
    //其中的一个方法就是一个远程服务调用
    @HttpExchange(url = "https://jsonplaceholder.typicode.com")
    public interface CommonService {@GetExchange("/comments/{id}") //设置请求的URIComment getCommentById(@PathVariable("id") Integer id);
    }
    
  • ④ 创建 HTTP 服务代理对象
    @Configuration(proxyBeanMethods = false)
    public class HttpConfiguration {@Beanpublic CommonService requestService(){WebClient webClient =WebClient.builder().build();return HttpServiceProxyFactory.builderFor(WebClientAdapter.create(webClient)).build().createClient(CommonService.class);}
    }
    
  • ⑤ 编写测试代码
    	@SpringBootTestclass HttpExchangeApplicationTests {@Autowiredprivate CommonService commonService;@Testpublic void test(){Comment comment = commonService.getCommentById(1);System.out.println(comment);}}
    
  • ⑥ 结果展示
    在这里插入图片描述

2.使用单个注解

  • ① 引入依赖

  • ② 编写 comment 数据类

  • ③ 声明服务接口

    //其中的一个方法就是一个远程服务调用
    public interface CommonService {@PutExchange("/comments/{id}")ResponseEntity<Comment> modifyCommentById(@PathVariable("id") Integer modifyId, @RequestBody Comment comment);
    }
    
  • ④ 创建 HTTP 服务代理对象

    @Configuration(proxyBeanMethods = false)
    public class HttpConfiguration {@Beanpublic CommonService requestService(){WebClient webClient = WebClient.create("https://jsonplaceholder.typicode.com");//WebClient webClient = WebClient.builder().baseUrl("https://jsonplaceholder.typicode.com").build(); //也可以使用这种方式HttpServiceProxyFactory proxyFactory = HttpServiceProxyFactory.builderFor(WebClientAdapter.create(webClient)).build();return proxyFactory.createClient(CommonService.class);}
    }
    
  • ⑤ 编写测试代码

    @SpringBootTest
    class HttpExchangeApplicationTests {@Autowiredprivate CommonService commonService;@Testpublic void test(){Comment comment = new Comment(123, 1, "gdb", "aaaaa", "bbbbbb");ResponseEntity<Comment> result = commonService.modifyCommentById(1, comment);System.out.println(result.getStatusCode());System.out.println(result.getHeaders());System.out.println(result.getBody());}
    }
    
  • ⑥ 结果展示
    在这里插入图片描述

3.定制 HTTP 请求服务


四、总结

1.部分方法过时

  • 动力节点王鹤Spring Boot3中代码的写法如下
    在这里插入图片描述
  • 由于新版的更新原来的方法已经过时了,大家可以按照如下的方式写
    在这里插入图片描述

2.过时的方法详解

  • Builder builder(HttpClientAdapter clientAdapter) ===> Builder builderFor(HttpExchangeAdapter)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • forCreate(WebClient webClient) ===> create(WebClient webClient)
    在这里插入图片描述

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

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

相关文章

java中实现事务的两种方式:编程式事务和声明式事务

涉及到与数据库交互就必须会用到事务&#xff0c;如果一个方法中需要用到事务的地方没有使用事务就会造成数据不一致的风险&#xff0c;进而导致比较严重的bug&#xff0c;比如扣款时&#xff0c;账户的余额已经进行了扣减但是相应的订单没有生成&#xff0c;这种涉及账目的问题…

方法阻塞的解决方案之一

1、简单使用 一个h一个cpp文件 #pragma once #include <iostream> #include <thread> #include <atomic> #include <chrono> #include <string>class Person {public:struct dog {std::string name;int age;};public:void a(std::atomic<bo…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式&#xff1a;在不破坏封装的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋&#xff0c;下完之后发现走错了&#xff0c;想要回退…

【C++】美感(beautiful)

题目描述 寿寿喜欢有美感的序列。 对于寿寿来说一个序列是有美感的&#xff0c;当且仅当这个序列每两个相邻的数的和是m的倍数。特别的&#xff0c;寿寿认为长度为1的序列也是具有美感的。 寿寿现在随便在纸上写了一个长度为n的序列a&#xff0c;这个序列目前还不具有美感。因此…

Unity 自动轮播、滑动轮播

如图所示&#xff0c;可设置轮播间隔&#xff0c;可左右滑动进行轮播 1.在UGUI创建个Image&#xff0c;添加自动水平组件 2.添加并配置脚本 3.代码如下&#xff0c;都有注释 using UnityEngine; using UnityEngine.UI;public class IndicatorManager : MonoBehaviour {public …

【乳腺肿瘤诊断分类及预测】基于LVQNN学习向量量化神经网络

课题名称&#xff1a;基于LVQ神经网络的乳腺肿瘤诊断&#xff08;类型分类&#xff09; 版本日期&#xff1a;2023-03-10 运行方式: 直接运行0501_LVQ0501.m 文件即可 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 威斯康辛大学医学院…

(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介 高级定时器的框图和通用定时器框图很类似&#xff0c;只是添加了其它的一些功能&#xff0c;如&#xff1a;重复计数器、带死区控制的互补输出通道、断路输入等。 高级定时器的时钟来自APB2, 而PCLK2 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 …

《微信小程序开发从入门到实战》学习九十九

7.4 视频组件 7.4.1 video组件 支持属性属性如下&#xff1a; 属性类型默认值说明最低版本src&#xff08;必填&#xff09;string要播放视频的资源地址&#xff0c;基础库2.3.0版本开始支持云文件ID1.0.0controlsbooleantrue是否显示默认播放控件&#xff08;播放/暂停按钮…

vue/js 调用系统打印功能进行图片(imgUrl,base64),表格,自定义内容,页面局部区域打印【print-js、html2canvas】

1.打印图片(imgUrl) <template><div><button click"jsonPrint">打印</button></div> </template><script lang"ts"> import printJS from "print-js"; export default {setup() {function jsonPrint(…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

detectron2的read_image方法

在看代码的时候&#xff0c;看到一行注释&#xff1a;use PIL, to be consistent with evaluation 说是用PIL方法加载&#xff0c;却又看见了BGR这种表述&#xff0c;后面的调用也都是cv2格式&#xff1a; 那我就要看下这里面是怎么实现的了&#xff0c;找到了read_image函数&…

[R] Why data manipulation is crucial and sensitive?

What does a data scientist really do? Identifying the pattern in cultural consumption, making fancy graph, engage a dialogue between data and the existing literature, refining hypothesis….(done within one months with three to four online meetings with p…

app的启动

前言 本篇文章讲解ios的应用程序的启动 应用程序的加载 点击一个app 首先&#xff0c;我们在手机上点击一个app图标 内核初始化 操作系统收到启动app的消息后&#xff0c;会调用内核代码初始化内存空间&#xff0c;为app创建进程然后操作系统通过系统调用读取并解析app的…

apktool 简单快速 反编译apk获取图片资源

apktool:下载地址&#xff1a;iBotPeaches / Apktool / Downloads — Bitbucket把 myapp.apk 和 apktool_2.9.3.jar 放在同一文件夹&#xff0c;注意不要有中文路径 java -jar apktool_2.9.3.jar d -f myapp.apk -o myapp java -jar: java 执行jar命令 apktool_2.9.3.jar: a…

C语言实现的数组合并与排序程序

引言 在本篇博客中&#xff0c;我们将详细解析一段C语言代码&#xff0c;该代码实现了从用户处接收两个整数数组&#xff0c;将它们合并为一个数组后进行排序&#xff0c;并最终输出排序后的结果。这段代码主要涵盖了数组操作、数据输入、冒泡排序算法以及数据输出等核心编程概…

【涵子来信】——拆机,感想

大家好&#xff0c;我是涵子。 初中的第一个学期结束了&#xff0c;来临寒假。我在寒假做了一件有趣的事情&#xff1a;拆机&#xff0c;修手机。今天我来分享分享这件事情。 拆机 情况介绍 拆机对象&#xff1a; iPhone 6 Plus 情况&#xff1a; 电池健康度100%&#xff08…

按身高和体重排队(100%用例)C卷(JavaPythonC++Node.jsC语言)

某学校举行运动会,学生们按编号 (1 、 2 、 3 … n) 进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。 输入描述: 两个序列,每个序列由n个正整数组成(0 < n <…

Unity-WebGL

问题&#xff1a;提示gzip压缩报错解决&#xff1a;关闭打包的地方压缩&#xff0c;如下图问题&#xff1a;窗口未全屏解决&#xff1a;使用百分比画布替换固定尺寸画布 参考&#xff1a;新版Unity打包Webgl端进行屏幕自适应_unity webgl分辨率自适应-CSDN博客问题&#xff1a;…

GBASE数据库注册例程的权限

要在数据库中注册例程&#xff0c;被授权的用户将 SPL 命令包含在 CREATE FUNCTION 或 CREATE PROCEDURE 语句中。数据库服务器存储内部注册了的 SPL 例程。下列用户具 有在数据库中注册新的例程的资格&#xff1a; • 有 DBA 权限的任何用户可在 CREATE 语句中&#xff0c;使…

Springboot+Redis

首先前提我们要在自己的本机电脑或者服务器上安装一个redis的服务器 Redis配置 添加依赖: <!-- SpringBoot Boot Redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artif…