java - 如何验证/处理 Spring WebClient 响应?
问题描述
所以应用流程是这样的:
- Spring 应用收到请求 -> {"id": "UUID"}
- 使用 WebClient 调用外部 Web 服务
- 验证在步骤 2 中从 WebClient 收到的响应。如果验证通过,则返回 true 或 false。
- 执行其他验证操作(通过调用其他进程或 ext 服务)并将响应发送回用户。
这是我正在使用的网络客户端(副本):
public Mono<Details> someRestCall(String name) {
return this.webClient.get().url("/{id}/details", name)
.retrieve().bodyToMono(Details.class);
}
现在我不想通过控制器将此 Mono 对象直接返回给客户端(如 Angular 应用程序),因为这是一个中间步骤。我想对从 WebClient 收到的响应进行一些验证。
我已经尝试过.block()
检索函数的方法,但根据反应式编程,这似乎是一种不好的做法。(阻塞操作)此外,我无法理解如何使用该.subscribe()
方法来检索响应对象并对其运行验证/检查并True
在验证通过时返回。
简单来说,我不想从我的模块/验证代码返回 Mono 对象,而是想返回一个普通的布尔值/Java 对象。
我是响应式编程的新手,谁能帮我解决这个问题?
解决方案
稍加努力,您就可以对 WebClient 调用返回的 POJO 使用基于 JSR-303 注释的验证。这是一个最小的例子:
@Component
public class MyClass {
final Validator validator;
MyClass(Validator validator) {
this.validator = validator;
}
<T> T validate(T obj) {
Set<ConstraintViolation<T>> violations = this.validator.validate(obj);
if (violations.size() > 0) {
throw new ResponseStatusException(INTERNAL_SERVER_ERROR, violations.toString());
}
return obj;
}
public Mono<Details> someRestCall(String name) {
return this.webClient.get()
.url("/{id}/details", name)
.retrieve()
.bodyToMono(Details.class)
.doOnNext(this::validate);
}
}
在实践中,您可能需要格式更好的违规字符串,如果在几个地方完成验证,那么您可以将该逻辑提升到自己的类中。
推荐阅读
- javascript - 使用 for 循环添加段落
- javascript - 在 SuiteScript 中单击(addSubmitButton)“发送”按钮后文本验证不成功后如何发出警报?
- javascript - 循环 div 并将其作为单独的组件和循环有什么区别?
- excel - 为什么 Excel.Application.InputBox 会留下隐藏的 Excel 进程?
- python - 如何在 scipi linalg 求解器期间使所有核心工作?
- c - 使用 fgets 和 strtok 在 C 中读取 CSV 文件仅读取第一列
- swift - Swift - 摆脱守卫/让过度使用和可选项的最佳实践
- reactjs - 使用 React Bootstrap Typeahead 选择匹配的选项
- r - 显示数据不是面板时每个 ID 出现的行数 (R)
- vue.js - vue-router 路由中的递归 slug