spring-webflux - WebClient - 如何忽略特定的 HTTP 错误
问题描述
我想创建一个忽略特定 HTTP 错误的 Spring WebClient。从 WebClient.retrieve() 的文档中:
默认情况下,4xx 和 5xx 响应会导致 WebClientResponseException。要自定义错误处理,请使用 ResponseSpec.onStatus(Predicate, Function) 处理程序。
我希望通过 WebClient 实例的所有调用都忽略特定的 HTTP 错误。这就是为什么 onStatus() 对我没有用(必须根据响应设置)。
我能想到的最好的是:
WebClient webClient = WebClient.builder().filter((request, next) -> {
Mono<ClientResponse> response = next.exchange(request);
response = response.onErrorResume(WebClientResponseException.class, ex -> {
return ex.getRawStatusCode() == 418 ? Mono.empty() : Mono.error(ex);
});
return response;
}).build();
URI uri = UriComponentsBuilder.fromUriString("https://httpstat.us/418").build().toUri();
webClient.get().uri(uri).retrieve().toBodilessEntity().block();
但它确实抛出异常而不是忽略它(传递给 onErrorResume() 的 lambda 永远不会被调用)。
编辑:修复了第一个答案指出的错误。
解决方案
更新:原来这个答案并没有解决过滤掉特定状态代码的核心问题,只是解决了一般的编码模式。
没有调用 lambda的原因onErrorResume
是它response.onErrorResume
创建了一个全新的Mono
并且您的代码不使用结果(即它没有分配给response
变量),因此最终返回了Mono
没有onErrorResume
运算符的 a。
使用 Project Reactor 通常避免声明局部变量和变量并使用单个链是一个好Mono
习惯Flux
。这有助于避免类似的细微错误。
WebClient webClient = WebClient.builder()
.filter((request, next) -> next.exchange(request)
.onErrorResume(WebClientResponseException.class, ex -> ex.getRawStatusCode() == 418 ? Mono.empty() : Mono.error(ex)))
.build();
推荐阅读
- javascript - 我可以在我的反应组件中获取我的 Key 的值吗
- powershell - 带有“-”和数字的 Powershell 拆分字符串
- android - 错误膨胀类 android.support.v7.widget.SearchView - android
- java - 需要使用 JPA @Query 返回自定义对象列表
- excel - 从同一位置另存为具有动态日期的文件
- typescript - Typescript babel-plugin-module-resolver
- javascript - 如何在单独的变量中获取数组值
- javascript - 在导航列表末尾添加更多按钮,一旦没有空间显示所有项目
- javascript - 在javascript中为客户端设置不同的时区
- python - 读取csv时如何解决Unicoder问题