gpt4 book ai didi

spring-webflux - 将 ClientResponse 转换为 ServerResponse

转载 作者:行者123 更新时间:2023-12-01 01:46:14 24 4
gpt4 key购买 nike

我正在尝试在 REST 服务器和调用客户端应用程序之间编写一种代理,以便通过向 REST 调用添加属性来强制隐私。

我不想检查来自服务器的响应,我只想将它传递给客户端。

我想用 spring-webflux 来做这件事,因为我希望用事件驱动的方法来节省一些 CPU。但我完全被困住了。

这是我尝试的:

public Mono<ServerResponse> select(ServerRequest request) {
return request.principal().flatMap((principal) -> {
return WebClient.create(solrUrl).get().uri(f -> {
URI u = f.path(request.pathVariable("a")).path("/b/").queryParams(queryModifier.modify(principal, request.pathVariable("collection"), request.queryParams()).block()).build();
if (debug) {
log.debug("Calling {}", u);
}
return u;
})
.exchange()
.flatMap((ClientResponse mapper) -> {
BodyBuilder bodyBuilder = ServerResponse.status(mapper.statusCode());
bodyBuilder.body(BodyInserters.fromDataBuffers(mapper.bodyToFlux(DataBuffer.class)));
bodyBuilder.headers(c -> mapper.headers().asHttpHeaders().forEach((name, value) -> c.put(name, value)));
//.body(DefaultserverreBodyInserters.fromPublisher(mapper.bodyToMono(DataBuffer.class), DataBuffer.class)));
//.body(BodyInserters.fromDataBuffers(mapper.bodyToFlux(DataBuffer.class))));
//.body(BodyInserters.fromDataBuffers(mapper.body(BodyExtractors.toDataBuffers()))));
//.body(mapper.bodyToMono(String.class), String.class));
//.build());
return bodyBuilder.build();
});
});
}

我通过 RouterFunction 将它绑定(bind)到面向客户端的 REST API:
@Configuration
public class VoiceRouterFunctions {

@Bean
public RouterFunction<ServerResponse> route(ClientPropertiesRequestHandler handler) {
return RouterFunctions.route(RequestPredicates.GET("/v3/{a}/select")
.and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), handler::select);
}
}

响应为 200 - OK,体内没有任何东西。有任何想法吗?

最佳答案

以下是对您的问题的解释,希望它可以帮助您理解为什么会发生这种情况。

您的问题中的错误如下:BodyBuilder.body(...)方法实际上 构建 返回 一个 Mono<ServerResponse> , 但它确实 不是 修改构建器。如果您查看 source code of the builder,您可以看到这一点。 .

通过查看您的代码更容易理解:

BodyBuilder bodyBuilder = ServerResponse.status(...);  // 1
bodyBuilder.body(...); // 2
bodyBuilder.headers(...); // 3
return bodyBuilder.build(); // 4

这就是发生的情况:在第 1 行,您创建了一个构建器,在第 2 行,您添加了一个主体并构建它,但您没有将结果存储在变量中(哎呀!),然后在第 3 行,您将标题添加到初始builder,它没有主体,因为 body(...)函数不会修改构建器,并且在第 4 行您构建并返回空构建器。所以,在你的情况下,第 2 行什么都不做。

正如您在回答中偶然发现的那样,解决方案是调用 body(...)函数放在最后,应该放在最后!

以下示例也可以。注意行的新顺序。
BodyBuilder bodyBuilder = ServerResponse.status(...);  // 1
bodyBuilder.headers(...); // 3
return bodyBuilder.body(...); // 2

关于spring-webflux - 将 ClientResponse 转换为 ServerResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49069284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com