在我的应用程序中,我有一个端点 /my-endpoint
只支持post方法的路径。它接受一个必须与我的身体相适应的身体 MyRequest
班级。
@Validated
data class MyRequest(
@get:JsonProperty("age", required = true)
@field:Size(min = 3, max = 128, message = "age must be between 3 and 128")
val age: String,
@get:JsonProperty("zip_code", required = true)
@field:Pattern(regexp = "\\d{2}-\\d{3}", message = "address.zip_code is invalid. It is expected to match pattern \"\\d{2}-\\d{3}\"")
val zipCode: String
)
我的控制器看起来像这样
@PostMapping("/my-endpoint")
fun myEndpoint(
@Valid @RequestBody request: MyRequest,
): Mono<ResponseEntity<MyResponse>> {
return myService.processRequest(request)
.map { ResponseEntity.ok().body(it) }
}
每次我收到对这个特定端点的一些请求(我有其他端点,但应该忽略它们)-我想将消息发布到我的原始请求主体(作为字符串)-不管请求主体是否有效。
如何拦截请求以发布消息-端点仍在工作?
1条答案
按热度按时间b4wnujal1#
我认为你可以实现你自己的网络过滤器。过滤api路径
exchange.getRequest().getPath()
使用简单的if块并使身体通过exchange.getRequest().getBody()
```@Component
@RequiredArgsConstructor
@Slf4j
public class MyFilter implements WebFilter {
private final MyPublisher myPublisher;
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
if (pathMatches(exchange.getRequest().getPath()) {
return exchange.getRequest().getBody()
.map(dataBuffer -> {
final String requestBody = dataBuffer.toString(StandardCharsets.UTF_8));
this.myPublisher.publish(requestBody).subscribe();
return exchange;
}).then(chain.filter(exchange));
}
return chain.filter(exchange);
}
}