将所有http请求发布到pubsub

fdbelqdn  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(358)

在我的应用程序中,我有一个端点 /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) }
}

每次我收到对这个特定端点的一些请求(我有其他端点,但应该忽略它们)-我想将消息发布到我的原始请求主体(作为字符串)-不管请求主体是否有效。
如何拦截请求以发布消息-端点仍在工作?

b4wnujal

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);
}
}

相关问题