Spring WebClient 无法从 REST API 读取数据

2024-03-30

在我的 Spring Boot 应用程序中,我想使用 Spring WebClient 从以下 API 读取数据,如下所示(我之前没有经验,在对许多页面和文章进行多次搜索后,我决定使用 Spring WebClient):

端点 URL 是:

service:

private static final String BASE_URL = "https://demo-api/v1";
private WebClient webClient = WebClient.create(BASE_URL);

public Mono fetchMergedData(String city) {
    Mono<EduData> edu = getEduData(city);
    Mono<GeoData> geo = getGeoData(city);

    return Mono.zip(edu, geo, MergedData::new);
}

public Mono<EduData> getEduData(String city) {
    return webClient.get()
            .uri("/edu/{city}", city)
            .retrieve()
            .bodyToMono(EduData.class);
}

public Mono<GeoData> getGeoData(String city) {
    return webClient.get()
            .uri("/geo/{city}", city)
            .retrieve()
            .bodyToMono(GeoData.class);
}

以下是型号:

models:

@Getter
public class EduData {

    private int institution;
}

@Getter
public class GeoData {

    private int population;
}

@Getter
public class MergedData {

    private int institution;
    private int population;

    public MergedData(EduData edu, GeoData geo) {
        this.institution = edu.getInstitution();
        this.population = get.getPopulation();
    }
}

虽然当我使用 Postman 测试时没有错误并且所有端点都返回数据,但我在两个端点中都看不到任何数据edu, geo变量,也不是返回fetchMergedData()方法。那么,问题出在哪里呢?


要从 Mono 中获取数据,您可以block()(将其变成阻塞操作),或者subscribe()并传递给它一个Consumer or Subscriber.

简单地阻止调用就会给你结果,但如果你想以反应方式执行此操作,那么你需要订阅 Mono。

// Using a block
this.institution = edu.getInstitution().block();

// Using a subscription, when available, EduData can be accessed via response.get
AtomicReference<EduData> response = new AtomicReference<>();
edu.getInstitution().subscribe(response::set);

这是一个简单的订阅,提供了Consumer.

public class SomeClass {
  EduData eduData;

  public void setEduData(EduData eduData) {
    this.eduData = eduData;
  }

  public void fetchData(String city) {
    webClient.get()
        .uri("/edu/{city}", city)
        .retrieve()
        .bodyToMono(EduData.class).subscribe(this::setEduData);
  }
}

当响应可用时,setEduData方法将被调用并返回结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring WebClient 无法从 REST API 读取数据 的相关文章

随机推荐

  • CXF 客户端安全

    我正在创建 Java Soap Web 服务的客户端 但无法弄清楚如何正确传递密码 这是我的 硬编码 密码示例 Test public void exploratorySecurityTest String username user St
  • WebClient Unicode - 哪种 UTF8?

    当我创建 WebClient 来使用一些 RESTful xml 时 我可以通过两种方式指定 unicode 编码 WebClient wc new WebClient wc Encoding Encoding UTF8 wc Encodi
  • 使用 CloudFront 部署在 S3 上的 VueJS 应用程序“指定的密钥不存在”

    我已经使用 Route53 部署了带有 S3 和 CloudFront 的 VueJS 应用程序 看起来一切都很顺利 我可以访问该网站https my domain com 我可以导航到我使用 Vue 路由器设置的不同路线 但是 当我尝试访
  • 在 Ionic 2 中使用图像资源的正确方法

    Ionic 2 中图像资源的最佳实践是什么 我有一堆 SVG 想用作非系统图标 我发现了一些关于使用 Gulp 的旧技巧 但似乎 Ionic 团队已决定将 Rollup 作为首选构建工具 到目前为止还没有相关文档 有人告诉我只需将它们添加到
  • 有没有办法通过 QueryDSL 中的 Predicate API 急切地获取惰性关系?

    我正在使用QueryDslPredicateExecutor来自 Spring Data JPA 项目 我面临着急于获取惰性关系的需要 我知道我可以在 Repository 接口中使用本机 JPA QL 查询 甚至可以使用 Query DS
  • 如何使用恢复按钮进入上一个活动?

    我的应用程序工作正常 但我的目的是当我关闭应用程序然后再次运行它时 我的应用程序将在最后一个活动中打开 我希望当我再次打开时 主要活动会显示出来 如果我单击 恢复 则最后一个活动将打开 所以我有4个Activity called Main
  • 内存警告后在 iOS 上运行 OpenGL 崩溃

    我遇到了带有 OpenGL 组件的应用程序在 iPad 上崩溃的问题 该应用程序抛出内存警告并崩溃 但它似乎没有使用那么多内存 我错过了什么吗 该应用程序基于 Vuforia 增强现实系统 大量借鉴了 ImageTargets 示例 我需要
  • 为什么将函数转换为除返回类型之外相同的函数类型会失败? [复制]

    这个问题在这里已经有答案了 可能的重复 返回类型是函数签名的一部分吗 https stackoverflow com questions 290038 is the return type part of the function sign
  • onSelectRow 中的 jqGrid 行对象

    如何获取 jqGrid 中选定行上的行对象 我需要实际的对象 而不是单元格值 我已阅读文档 但找不到可以为我提供行对象的方法 由于我使用自定义格式化程序 因此 cellValue 将不起作用 如果你实施自定义格式化程序 http www t
  • 阶乘递归

    我正在尝试编写一种算法来使用递归函数计算数字的阶乘 这是我的代码 include
  • 如果我们不注销 BroadcastReceiver 会发生什么?

    假设我动态注册一个广播接收器这是一个内部类Activity in onCreate 并且不要在代码中的任何地方取消注册它 现在假设finish 被调用 一段时间后 应用程序再次打开 会使用新的接收者对象吗 考虑到具有相同意图过滤器的旧接收器
  • PEP 412 是否会使 __slots__ 变得多余?

    PEP 412 http www python org dev peps pep 0412 在 Python 3 3 中实现 引入了对属性字典的改进处理 有效减少了类实例的内存占用 slots http docs python org 3
  • Python PyPDF2 合并旋转页面

    我正在使用Python报告实验室 https bitbucket org rptlab reportlab canvas 生成带有水印的覆盖文档 将其合并到源 pdf 文档中 带有PyPDF2 https github com mstamy
  • 使用 iTextSharp 实现 PDF 中的图像透明度

    我有一个传入的 jpg 文件 我可以将其颜色设置为透明 当我将图像添加到另一个图像时 效果非常好 我正在尝试使用 iTextSharp 将相同的图像添加到 PDF 但我无法使透明度发挥作用 我尝试了两种方法 但都不起作用 第一种方法是在位图
  • 两个 Android 应用程序如何相互通信?

    两个 Android 应用程序的一般通信架构是什么 Case 1 我有两个Android应用程序 a 一个是服务器 等待客户端请求 处理请求 从某些 sqlite 数据库读取数据 并将结果返回给客户端 该服务器应用程序在其自己独立的 And
  • 是否可以通过 iOS SDK 在 Facebook 请求对话框中显示所有好友?

    我正在使用 Facebook iOS SDK v3 17 我希望允许用户邀请多个朋友到我的应用程序 而不使用可邀请的朋友 API 我没有 Canvas 应用程序 想知道是否真的可以在多好友选择器中看到用户的所有好友 我的代码是 FBWebD
  • 重命名 CloudFormation 模板中的资源

    您可以重命名 CloudFormation 模板中的资源吗 假设我创建了一个堆栈模板来创建单个 lambda 函数 GetTheFunnyPhraseText Type AWS Serverless Function Properties
  • 如何在纯 Ruby 中使用 Capybara(没有 Rails)?

    我正在尝试让 Capybara 在一个简单的 Ruby 脚本中运行 即没有 在 Rails 之外 这是脚本 require rubygems require capybara require capybara dsl include Cap
  • Python子进程:如何三次使用管道? [复制]

    这个问题在这里已经有答案了 我想在以下行中使用子进程 convert loxie orig png bmp mkbitmap f 2 s 2 t 0 48 potrace t 5 progress s o DSC00232 svg 我发现感
  • Spring WebClient 无法从 REST API 读取数据

    在我的 Spring Boot 应用程序中 我想使用 Spring WebClient 从以下 API 读取数据 如下所示 我之前没有经验 在对许多页面和文章进行多次搜索后 我决定使用 Spring WebClient 端点 URL 是 s