我正在编写一个代理黑白客户端和服务,在代理中,我确实需要一些基本的验证并将请求传递给服务,我在下面编写了相同的代码。您能否让我知道这是正确的方法,还是有其他更好的方法来解决这个问题。
public Mono<ServerResponse> handlePostRequest(ServerRequest request) {
return webClient.post().uri("/some/uri").headers(headers -> request.headers())
.body(request.bodyToMono(DataBuffer.class), DataBuffer.class)
.exchange()
.flatMap(response -> ServerResponse.status(response.statusCode())
.headers(c -> response.headers().asHttpHeaders().forEach((name, value) -> c.put(name, value)))
.body(response.bodyToMono(DataBuffer.class), DataBuffer.class));
}
答案 0 :(得分:0)
此代码段中没有任何验证(尽管您在问题中提到了这一要求)。
我也没有看到任何错误管理,如果远程服务器返回HTTP错误(应该转发响应吗?),或者如果它没有应答并超时,则该错误管理应该处理服务器应响应的内容发生。
除此之外,鉴于您所分享的简短要求,这可能适合您的用例。
请注意,根据您对HTTP客户端库和服务器的选择,DataBuffer
实例可以为PooledDataBuffer
-这意味着引用是基于引用的,以允许它们被重用,而使用它们的代码是负责释放他们。在这种情况下,您将重用这些缓冲区,以将它们转发给客户端作为请求正文或转发给服务器作为响应正文。 release
操作将在您写入网络之前完成。
最后,如果您要查找更复杂的功能,可以看看Spring Cloud Gateway project可以做到的更多。