07 SB3之@HttpExchange(TBD)

news2024/9/28 17:34:53

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 Todo
            todo);
            
    @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 {
	  //每个实体类都要创建一个代理对象
    @Bean
    public TodoService requestService(){
        //创建服务接口的代理对象,基于WebClient
        WebClient 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 {
    @Resource
    private TodoService requestService;

    @Test
    void testQuery() {
        Todo todo = requestService.getTodoById(1);
        System.out.println("todo = " + todo);
    }

    @Test
    void 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);
    }

    @Test
    void testModifyTitle() {
//org.springframework.http.HttpHeaders
        HttpHeaders entries = requestService.pathRequest(5, "homework");
        entries.forEach((name, vals) -> {
            System.out.println(name);
            vals.forEach(System.out::println);
            System.out.println("=========================");
        });
    }

    @Test
    void 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);
    }

    @Test
    void testRemove() {
        requestService.removeTodo(2);
    }
}

但是,没有搞太清楚原理.
例如: 为什么在接口中是用Get方法?为什么是路径传参?是https://jsonplaceholder.typicode.com/todos那边规定的吗?
尝试更改为param传参失败.

  @GetExchange("/todos/{id}")
    Todo getTodoById(@PathVariable Integer id);

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

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

相关文章

MySQL进阶之触发器

MySQL进阶之触发器 目录 MySQL进阶之触发器什么是触发器触发器的使用场景自定义触发器查看触发器删除触发器示例 什么是触发器 触发器是一种特殊的存储过程&#xff0c;它通常与表一起创建、修改和删除 触发器关键字&#xff1a;trigger&#xff0c;是指事先为某张表绑定一段…

【论文阅读笔记】Taming Transformers for High-Resolution Image Synthesis

Taming Transformers for High-Resolution Image Synthesis 记录前置知识AbstractIntroductionRelated WorkMethodLearning an Effective Codebook of Image Constituents for Use in TransformersLearning the Composition of Images with Transformers条件合成合成高分辨率图…

[ESP32 IDF]web server

目录 通过web server控制LED 核心原理解析 分区表 web server的使用 错误Header fields are too long的解决 通过web server控制LED 通过网页控制LED灯的亮灭&#xff0c;一般的ESP32开发板都可以实现&#xff0c;下面这篇文章是国外开发者提供的一个通过web server控制…

进程间通信的7种方式以及优点

七种通信方式为有名管道、无名管道、信号、消息队列、共享内存、信号灯集、套接字。 无名管道&#xff1a; 无名管道是没有名字的管道&#xff0c;是一个特殊的文件。 因为没有名字只能进行亲缘进程之间进行通信&#xff0c;也可以自己和自己进行通信。 无名管道打开会开启两个…

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…

断电保持霍尔传感器

断电保持霍尔传感器的工作原理 断电保持霍尔传感器是一种利用变压器或共振电路的检测元件&#xff0c;通过检测物体与探头之间的物理距离控制电路的开关状态&#xff0c;从而实现对物体位置和状态的监测。该开关可以通过调试和校准以满足不同场合的要求。 断电保持霍尔传感器控…

【LeetCode】每日一题 2024_1_31 找出不同元素数目差数组(数组/哈希)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;找出不同元素数目差数组题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 1 月的最后一天&#xff0c;每日一题又坚持了一个月呀 题目&#xff…

编程实例分享,电玩城计时电玩店计时收费管理系统软件,可以控制电视电源计时程序

编程实例分享&#xff0c;电玩城计时电玩店计时收费管理系统软件&#xff0c;可以控制电视电源计时程序 一、前言 以下教程以 佳易王电玩店计时计费软件V18.0为例说明&#xff0c;软件程序下载可以点击最下方官网卡片 如上图&#xff0c;开始计时图片改变&#xff0c;并记录…

智能分析网关V4+EasyCVR视频融合平台——高速公路交通情况的实时监控和分析一体化方案

随着2024年春运帷幕的拉开&#xff0c;不少人的返乡之旅也即将开启&#xff0c;从这几日的新闻来看&#xff0c;高速上一路飘红。伴随恶劣天气&#xff0c;加上激增的车流&#xff0c;极易导致高速瘫痪&#xff0c;无法正常使用。为解决此问题&#xff0c;助力高速高效运营&…

K8s 集群可观测性-数据分流最佳实践

简介 在微服务架构下&#xff0c;一个 k8s 集群中经常会部署多套业务&#xff0c;同时也意味着不同团队、不同角色、不同的业务会在同一集群中&#xff0c;需要将不同业务的数据在不同的空间进行管理和查看。 在传统的主机环境下&#xff0c;这个是可以通过不同的主机部署 Da…

C语言项目---贪吃蛇

目录 一 、知识铺垫1.win32API介绍 二、贪吃蛇的数据结构的设计1.整体框架2.初始化界面3.贪吃蛇的运行4.游戏的退出 三、整体代码 一 、知识铺垫 贪吃蛇涉及的知识&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、win32API等 1.win32API介绍 Windows…

vue项目在线预览和下载文档

在线预览&#xff1a;利用微软提供的Office Online平台&#xff0c;即可实现在线预览doc、ppt、excel等文档。 地址为&#xff1a;https://view.officeapps.live.com/op/view.aspx 下载&#xff1a;若要实现下载功能&#xff0c;直接将url赋值给a标签的href属性即可 下载实现方…

如何从电脑恢复已删除的文件

意外删除文件可能会导致噩梦般的场景。即使文件被故意删除&#xff0c;您仍然可能需要恢复文件的过去草稿或版本。值得庆幸的是&#xff0c;有多种方法可以恢复电脑上已删除的文件&#xff0c;无论是否花钱。以下是四种最常见的已删除文件恢复方法。 如何从电脑恢复已删除的文件…

移动端常见布局

单独移动端页面&#xff08;主流&#xff09; 1&#xff0c;流式布局&#xff08;百分比布局&#xff09; 流式布局&#xff0c;就是百分比布局&#xff0c;也称非固定像素布局 通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩&#xff0c;不受固定像素的限制&#x…

第二十四天| 77. 组合

Leetcode 77. 组合 题目链接&#xff1a;77 组合 题干&#xff1a;给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 思考&#xff1a;回溯法。把回溯法的搜索过程抽象为树形结构。 每次从集合中选取元素&#xff0…

京东广告算法架构体系建设--大规模稀疏场景高性能训练方案演变

一、前言 京东广告训练框架随着广告算法业务发展的特点也在快速迭代升级&#xff0c;回顾近几年大致经历了两次大版本的方案架构演变。第一阶段&#xff0c;随着2016年Tensorflow训练框架的开源&#xff0c;业界开始基于Tensorflow开源框架训练更复杂的模型。模型对特征规模和…

Android之命令行烧写OTA镜像(一百八十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

MySQL 备份恢复

1.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了。 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数…

算法设计与分析实验:动态规划与回溯

目录​​​​​​​ 一、编辑距离 1.1 具体思路 1.2 思路展示 1.3 代码实现 1.4 复杂度分析 1.5 运行结果 二、买卖股票的最佳时机 2.1 具体思路 2.2 思路展示 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、单词拆分 3.1 具体思路 3.2 思路展示 3.3 代码实现…

【Nginx】Ubuntu如何安装使用Nginx反向代理?

文章目录 使用Nginx反向代理2个web接口服务步骤 1&#xff1a;安装 Nginx步骤 2&#xff1a;启动 Nginx 服务步骤 3&#xff1a;配置 Nginx步骤 4&#xff1a;启用配置步骤 5&#xff1a;检查配置步骤 6&#xff1a;重启 Nginx步骤 7&#xff1a;访问网站 proxy_set_header 含义…