簡體   English   中英

Spring WebClient 無法從 REST API 讀取數據

[英]Spring WebClient cannot read data from REST API

在我的 Spring Boot 應用程序中,我想使用 Spring WebClient 從以下 API 讀取數據,如下所示(我之前沒有經驗,在對許多頁面和文章進行多次搜索后,我得出結論使用 Z38008DD81C2F4D1D1D1D1ZWebClient):

端點 URL 是:

服務:

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);
}

以下是模型:

楷模:

@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 進行測試時沒有錯誤並且所有端點都返回數據,但我在edugeo變量和fetchMergedData()方法的返回中都看不到任何數據。 那么,問題出在哪里?

要從 Mono 中獲取數據,您可以使用block() (將其轉換為阻塞操作)或subscribe()並將其傳遞給ConsumerSubscriber

簡單地阻止呼叫會給您帶來結果,但如果您想以被動方式執行此操作,那么您需要訂閱 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方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM