远程访问@HttpExchange

news2024/11/22 21:47:53

提示:这是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}") //设置请求的URI
        Comment getCommentById(@PathVariable("id") Integer id);
    }
    
  • ④ 创建 HTTP 服务代理对象
    @Configuration(proxyBeanMethods = false)
    public class HttpConfiguration {
        @Bean
        public CommonService requestService(){
            WebClient webClient =WebClient.builder().build();
            return HttpServiceProxyFactory.builderFor(WebClientAdapter.create(webClient)).build().createClient(CommonService.class);
        }
    }
    
  • ⑤ 编写测试代码
    	@SpringBootTest
    	class HttpExchangeApplicationTests {
    	    @Autowired
    	    private CommonService commonService;
    	    @Test
    	    public 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 {
        @Bean
        public 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 {
        @Autowired
        private CommonService commonService;
        @Test
        public 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.coloradmin.cn/o/1422343.html

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

相关文章

KVM-安装-使用-迁移

一. KVM安装 1. 基础安装 # 下载源 curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 安装基础软件 yum -y install tree vim wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip nc nmap …

Qt关于qss文件的添加使用

把ui设计得更加的养眼&#xff0c;肯定需要对控件的属性进行设置&#xff0c;qt中就是关于qss文件的使用。 那么如何创建和添加qss文件呢 1.新建一个文本文件的txt 2.将文本文件的后缀改为qss&#xff08;类比html&#xff09; 3.放置到项目的资源文件夹下 4.添加资源文件 5.在…

基于Kubernetes的微服务架构,你学废了吗?

至于服务网关&#xff0c;虽然保留了 Zuul&#xff0c;但没有采用 Kubernetes 的 Ingress 来替代。这里有两个主要考虑因素&#xff1a;首先&#xff0c;Ingress Controller 并非 Kubernetes 的内置组件&#xff0c;有多种可选方案&#xff08;例如 KONG、Nginx、Haproxy 等&am…

asdf安装不同版本的nodejs和yarn和pnpm

安装asdf 安装nodejs nodejs版本 目前项目中常用的是14、16和18 安装插件 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf plugin-add yarn https://github.com/twuni/asdf-yarn.git可以查看获取所有的nodejs版本 asdf list all nodejs有很多找…

Wireshark网络协议分析 - TCP协议

在我的博客阅读本文 文章目录 1. 基础2. 实战2.1. 用Go写一个简单的TCP服务器与客户端2.2. Wireshark抓包分析2.3. 限制数据包的大小——MSS与MTU2.4. 保证TCP的有序传输——Seq&#xff0c;Len与Ack2.5. TCP头标志位——URG&#xff0c;ACK&#xff0c;PSH&#xff0c;RST&…

【前端素材】bootstrap3 实现地产置业公司source网页设计

一、需求分析 地产置业公司的网页通常是该公司的官方网站&#xff0c;旨在向访问者提供相关信息和服务。这些网页通常具有以下功能&#xff1a; 公司介绍&#xff1a;网页通常包含有关公司背景、历史、核心价值观和使命等方面的信息。此部分帮助访问者了解公司的身份和目标。 …

visual studio2022专业版安装步骤

目录 一、Visual studio下载二、创建C#项目——Hello World三、专业版秘钥激活 一、Visual studio下载 首先进入下载官网 先下载2022专业版&#xff0c;等等后面还需要选环境 我勾选了以下几个和c#开发有关的&#xff0c;后面缺什么还可以再安装所有以少勾了问题也不大 然后…

solidworks 焊接型材库

型材库中有大部分型材 H型钢有49种 八角钢有40种 扁钢有60种 不等边钢有84种 槽钢有41种 也可以按照自己需要的去添加 下载地址https://download.csdn.net/download/jintaihu/19347986

《金融电子化》昆仑银行在应用性能监控(APM)平台的实践与探索

《金融电子化》昆仑银行在应用性能监控&#xff08;APM&#xff09;平台的实践与探索 中国人民银行印发的《金融科技发展规划&#xff08;2022-2025年&#xff09;》是对金融科技发展的重要引领。规划强调了金融科技在推动金融行业现代化转型、提升金融服务效率和风险防控水平…

体验 AutoGen Studio - 微软推出的友好多智能体协作框架

体验 AutoGen Studio - 微软推出的友好多智能体协作框架 - 知乎 最近分别体验了CrewAI、MetaGPT v0.6、Autogen Studio&#xff0c;了解了AI Agent 相关的知识。 它们的区别 可能有人要问&#xff1a;AutoGen我知道&#xff0c;那Autogen Studio是什么&#xff1f; https://g…

直播不仅可以带货,还可以远程协作

直播是一种非常直观高效的信息共享模式&#xff0c;目前直播带货比较火&#xff0c;但我也不懂&#xff0c;现就我涉及的领域和实践做一些分享&#xff0c;目前我所做的直接互动分发系统在软硬件全系统闭环下&#xff0c;结合100ms级的低延迟&#xff0c;基本可以让人有深入其境…

Vue_Router_守卫

路由守卫&#xff1a;路由进行权限控制。 分为&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强&#xff0c;history没有#兼容性差"…

ImageNet预训练图像分类模型预测单张图像

导入基础工具包 import osimport cv2import pandas as pd import numpy as npimport torchimport matplotlib.pyplot as plt %matplotlib inline 计算设备确定 # 有 GPU 就用 GPU&#xff0c;没有就用 CPU device torch.device(cuda:0 if torch.cuda.is_available() else c…

pytorch学习笔记(十二)

以下代码是以CIFAR10这个10分类的图片数据集训练过程的完整的代码。 训练部分 train.py主要包含以下几个部件&#xff1a; 准备训练、测试数据集用DateLoader加载两个数据集&#xff0c;要设置好batchsize创建网络模型&#xff08;具体模型在model.py中&#xff09;设置损失函…

深入理解G0和G1指令:C++中的实现与激光雕刻应用

系列文章 ⭐深入理解G0和G1指令&#xff1a;C中的实现与激光雕刻应用⭐基于二值化图像转GCode的单向扫描实现⭐基于二值化图像转GCode的双向扫描实现⭐基于二值化图像转GCode的斜向扫描实现基于二值化图像转GCode的螺旋扫描实现基于OpenCV灰度图像转GCode的单向扫描实现基于Op…

Apple Pencil如何连接iPad?这里提供详细步骤

如果你刚拿起一支Apple Pencil&#xff0c;想和iPad一起使用&#xff0c;你需要先连接设备。将Apple Pencil与iPad配对的方法因你拥有的铅笔而异。 一旦你将Apple Pencil连接到iPad&#xff0c;你就可以利用这些方便的功能。你可以记下手写笔记&#xff0c;使用Scribble功能&a…

H5 嵌套iframe并设置全屏

H5 嵌套iframe并设置全屏 上图上代码 <template><view class"mp-large-screen-box"><view class"mp-large-screen-count"><view class"mp-mini-btn-color mp-box-count" hover-class"mp-mini-btn-hover" clic…

QEMU - e1000全虚拟化前端与TAP/TUN后端流程简析

目录 1. Host -> Guest 2.Guest ->Host 3. 如何修改以支持TUN设备的后端&#xff1f; 4. 相关 QEMU 源码 5. 实验 1. Host -> Guest 2.Guest ->Host 3. 如何修改以支持TUN设备的后端&#xff1f; 1. 简单通过后端网卡名字来判断是TUN还是TAP。 2. 需要前端全…

gdp调试—Linux

目录 介绍 使用 介绍 代码分为debug模式和release模式 如果一份代码要被调试&#xff0c;这份代码必须是debug Linux下编译代码默认是是release模式 如果你想代码是debug模式 必须加上 - g 小提&#xff1a; vim默认&#xff1a;命令模式 gcc默认&#xff1a;releas…

华为数通方向HCIP-DataCom H12-831题库(简答题01-27)

第01题 第02题 第03题 第04题 第05题 IS-IS是链路状态路由协议,使用SPF算法进行路由计算。某园区同时部署了IPV4和IPv6并运行IS-IS实现网络的互联与通。如图所示,该网络IPV4和IPV6开销相同,R1和R4只支持IPV4缺省情况下,计算形成的IPV6最短路径树中,R2访问R6的下一跳设备是…