在我的 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(使用前将#替换为@)