![](/img/trans.png)
[英]Spring Boot 2 - WebClient : Call Multiple Rest API's from one Controller
[英]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 進行測試時沒有錯誤並且所有端點都返回數據,但我在edu
、 geo
變量和fetchMergedData()
方法的返回中都看不到任何數據。 那么,問題出在哪里?
要從 Mono 中獲取數據,您可以使用block()
(將其轉換為阻塞操作)或subscribe()
並將其傳遞給Consumer
或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
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.