如何在 webclient 检索中处理 404
How to handle 404 in webclient retrive
我是 spring webclient 的新手,我编写了一个通用方法,可用于在我的应用程序中使用剩余 apis:
public <T> List<T> get(URI url, Class<T> responseType) {
return WebClient.builder().build().get().uri(url)
.header("Authorization", "Basic " + principal)
.retrieve().bodyToFlux(responseType).collectList().block();
}
我想 return 和清空列表,如果消耗 rest-api return 404.
有人可以建议如何实现吗?
默认情况下 retrieve 方法会针对任何 4xx 和 5xx 错误抛出 WebClientResponseException 异常
By default, 4xx and 5xx responses result in a WebClientResponseException.
您可以使用onErrorResume
webClient.get()
.uri(url)
.retrieve()
.header("Authorization", "Basic " + principal)
.bodyToFlux(Account.class)
.onErrorResume(WebClientResponseException.class,
ex -> ex.getRawStatusCode() == 404 ? Flux.empty() : Mono.error(ex))
.collectList().block();
您也可以使用 onStatus
它允许您过滤您想要的例外情况
public <T> List<T> get(URI url, Class<T> responseType) {
return WebClient.builder().build().get().uri(url)
.header("Authorization", "Basic " + principal)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, this::handleErrors)
.bodyToFlux(responseType)
.collectList().block();
}
private Mono<Throwable> handleErrors(ClientResponse response ){
return response.bodyToMono(String.class).flatMap(body -> {
log.error("LOg errror");
return Mono.error(new Exception());
});
}
从 Spring WebFlux 5.3 开始,他们添加了 exchange 方法,使您可以轻松处理不同的响应,如下所示:
public <T> List<T> get(URI url, Class<T> responseType) {
return WebClient.builder().build().get().uri(url)
.header("Authorization", "Basic " + principal)
.exchangeToFlux(clientResponse -> {
if (clientResponse.statusCode().equals(HttpStatus.NOT_FOUND)) {
return Flux.empty();
} else {
return clientResponse.bodyToFlux(responseType);
}
})
.collectList()
.block();
}
我是 spring webclient 的新手,我编写了一个通用方法,可用于在我的应用程序中使用剩余 apis:
public <T> List<T> get(URI url, Class<T> responseType) {
return WebClient.builder().build().get().uri(url)
.header("Authorization", "Basic " + principal)
.retrieve().bodyToFlux(responseType).collectList().block();
}
我想 return 和清空列表,如果消耗 rest-api return 404.
有人可以建议如何实现吗?
默认情况下 retrieve 方法会针对任何 4xx 和 5xx 错误抛出 WebClientResponseException 异常
By default, 4xx and 5xx responses result in a WebClientResponseException.
您可以使用onErrorResume
webClient.get()
.uri(url)
.retrieve()
.header("Authorization", "Basic " + principal)
.bodyToFlux(Account.class)
.onErrorResume(WebClientResponseException.class,
ex -> ex.getRawStatusCode() == 404 ? Flux.empty() : Mono.error(ex))
.collectList().block();
您也可以使用 onStatus
它允许您过滤您想要的例外情况
public <T> List<T> get(URI url, Class<T> responseType) {
return WebClient.builder().build().get().uri(url)
.header("Authorization", "Basic " + principal)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, this::handleErrors)
.bodyToFlux(responseType)
.collectList().block();
}
private Mono<Throwable> handleErrors(ClientResponse response ){
return response.bodyToMono(String.class).flatMap(body -> {
log.error("LOg errror");
return Mono.error(new Exception());
});
}
从 Spring WebFlux 5.3 开始,他们添加了 exchange 方法,使您可以轻松处理不同的响应,如下所示:
public <T> List<T> get(URI url, Class<T> responseType) {
return WebClient.builder().build().get().uri(url)
.header("Authorization", "Basic " + principal)
.exchangeToFlux(clientResponse -> {
if (clientResponse.statusCode().equals(HttpStatus.NOT_FOUND)) {
return Flux.empty();
} else {
return clientResponse.bodyToFlux(responseType);
}
})
.collectList()
.block();
}