我正在尝试使用 Spring Web Flux 来实现此代码:
您能否指导我如何根据客户端响应代码调用两个方法 parseRawSuccessResponse
和 parseRawFailedResponse
因为我有不同的返回值?另外,如何在不使用 block() 的情况下实现这段代码?
我尝试过这个:
Mono<AuthorizeRequest> transactionMono = Mono.just(transaction);
return client.post().uri(checkTrailingSlash(gatewayUrl) + token)
.body(transactionMono, AuthorizeRequest.class)
.exchange()
.flatMap(clientResponse -> {
if (clientResponse.statusCode().is4xxClientError()) {
return Mono.error(RuntimeException::new);
}
return clientResponse.bodyToMono(AuthorizeResponse.class);
});
//解析响应:
result.map(fooBar -> {
return parseRawSuccessResponse(fooBar);
}).doOnError(throwable -> {
// return parseRawFailedResponse(throwable);
}).block();
最佳答案
您可以使用可用于 java 的析取类型实现之一。
val result: Mono<Either<ClientError, AuthorizeResponse>> =
client.post().uri(checkTrailingSlash(gatewayUrl) + token)
.body(transactionMono, AuthorizeRequest.class)
.exchange()
.flatMap(response -> {
if (clientResponse.statusCode().is2xxSuccessful()) {
return response.bodyToMono(AuthorizeResponse.class).map(Either::right);
} else if (clientResponse.statusCode().is4xxClientError()) {
return response.bodyToMono(ClientError.class).map(Either::left);
} else {
return Mono.error(new RuntimeException("Unexpected response type"));
}
});
您可以自己实现析取类型,只需使用现有的实现即可。流行的选项之一是:vavr.io
回答问题的第二部分,请使用Mono.subscribe()
。使用 .block()
转义响应式(Reactive)上下文并不惯用,您只需根据 Monos 和 Fluxes 构建计算链,然后在最后执行一次订阅即可。
关于java - 打印 doOnError 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57697717/