我正在使用响应式 WebClient 构建一个与其他 2 个 API 通信的 API。API2 需要从 API1 获取信息,然后我的服务结合并返回这两个信息。资源:
@GetMapping("monoMedication/{medID}")
public Mono<Object> getMonoMedication(@PathVariable String medID) throws SSLException {
Mono<Login> Login =createWebClient()
.post()
.uri("URI_LOGIN_API1" )
.contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromObject(body))
.retrieve()
.bodyToMono(Login.class);
return Login.map(login-> {
Mono<String> medicationBundles = null;
try {
medicationBundles = createWebClient()
.post()
.uri("URI_API1_GET_DATA")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromObject("Information"))
.header("Authorization", login.getSessionId())
.retrieve()
.bodyToMono(String.class);
} catch (SSLException e) {
e.printStackTrace();
}
return medicationBundles.map(bundles_string -> {
try {
List<Object> bundle_list = mapper.readValue(bundles_string, new TypeReference<List<Object>>(){});
bundle_list.forEach(bundle-> processBundle(bundle,medicationList));
return medicationList;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
})
})
}
功能:
List<String> medicationList = new ArrayList<>();
private void processBundle(Object bundle, List<String> medicationlist) {
//do something to get id from bundle
String ID = bundle.getID();
// if i add something to medicationList.add(ID) here, it is in the required return of my API
Mono<String> Medication =
webClientBuilder.build()
.get()
.uri("URI_API2_GET_DATA"+ID)
.retrieve()
.bodyToMono(String.class);
Medication.map(medication_ID -> {
//do something to get information from medication_ID
String info = medication_ID.getInfo();
//this Information comes after the required return
return medicationList.add(info+ID);
}).subscribe();
}
我的问题是,返回是在所需的最后一张地图完成之前。我不知何故错过了一些东西。我尝试了不同的方法,例如 then()、thenMany()、thenReturn() 在不同的位置。有没有办法做到这一点?如果有一个可能已经完成的简单示例,那也会有所帮助!