使用Mono.zip处理API调用Spring web flux响应中的异常



我有一个代码如下。我正在尝试压缩内容。p1Mono和p2Mono是对远程服务的API调用。它们抛出各种响应HTTP响应代码。如何处理这些API故障并返回异常和相应的代码?

return Mono.zip(p1Mono,
p2Mono).flatMap(data -> {
P1 p1 = data.getT1();
p2 p2 = data.getT2();
//some operation and combine result to p
return Mono.just(p);
});

这样的东西怎么样:

注意-您可以定义单独的自定义异常,甚至可以用其他方式处理错误。

Mono<ClientResponse> api1ResponseMono = webClient.post().uri("/some/api1").exchange();
Mono<ClientResponse> api2ResponseMono = webClient.post().uri("/some/api2").exchange();
return Mono.zip(api1ResponseMono,api2ResponseMono)
.flatMap(tuple -> {
ClientResponse api1Response = tuple.getT1();
ClientResponse api2Response = tuple.getT2();
HttpStatus api1ResponseHttpStatus = api1Response.statusCode();
if(api1ResponseHttpStatus.is4xxClientError() || api1ResponseHttpStatus.is5xxServerError()){
return api1Response.bodyToMono(String.class)
.flatMap(api1ResponseBody -> {
return Mono.error(new MyCustomException("Call to Api1 failed with response code: " + api1ResponseHttpStatus.value() + " because: " + api1ResponseBody));
});
}
HttpStatus api2ResponseHttpStatus = api2Response.statusCode();
if(api2ResponseHttpStatus.is4xxClientError() || api2ResponseHttpStatus.is5xxServerError()){
return api2Response.bodyToMono(String.class)
.flatMap(api2ResponseBody -> {
return Mono.error(new MyCustomException("Call to Api2 failed with response code: " + api2ResponseHttpStatus.value() + " because: " + api2ResponseBody));
});
}
Mono<MyCustomResponsePojo1> api1ResponseBodyMono = api1Response.bodyToMono(MyCustomResponsePojo1.class);
Mono<MyCustomResponsePojo2> api2ResponseBodyMono = api1Response.bodyToMono(MyCustomResponsePojo2.class);
return Mono.zip(api1ResponseBodyMono,api2ResponseBodyMono)
.flatMap(t -> {
MyCustomResponsePojo1 api1ResponseBody  =t.getT1();
MyCustomResponsePojo2 api2ResponseBody  =t.getT2();
//some operation and combine result to p
return Mono.just(p);
});
});

最新更新