gpt4 book ai didi

java - 有没有办法将 Flux 作为表单数据提供给 WebClient 主体?

转载 作者:行者123 更新时间:2023-11-30 05:41:48 25 4
gpt4 key购买 nike

我想使用 WebClient 访问某些受限资源,因此需要提供登录名和密码并将其编码为表单数据。这样就可以正常工作了

private Mono<MyDataType> getMyDataType() {
return WebClient.builder().build().post()
.uri(MY_URI)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(BodyInserters.fromFormData(getFormData()))
.exchange()
.flatMap(clientResponse -> clientResponse.bodyToMono(MyDataType.class));
}

private MultiValueMap<String, String> getFormData() {
MultiValueMap<String, String> credentials = new LinkedMultiValueMap<>();
credentials.add("login", readLoginStringFromDiskAsString);
credentials.add("password", readPasswordStringFromDiskAsString);
}

但是,我的read*如您所见,函数是阻塞的 - 简单 Files.readAllBytes ,就像您在任何其他应用程序中所做的那样。我想将这种读取从磁盘转换为更异步的方式,例如使用 DataBufferUtils 或类似的东西。问题是,Spring只提供了fromFormData的一种实现-fromFormData(MultiValueMap<String, String> formData) .

有没有办法真正实现这一目标?

最佳答案

您可以更改您的 getFormData方法返回Mono<MultiValueMap<String, String>>并平面映射其结果以异步访问凭据

private Mono<MultiValueMap<String, String>> getFormDataNonBlocking() {
//asynchronous nonblocking reading of the credentials
}

private Mono<MyDataType> getMyDataType() {
return getFormDataNonBlocking()
.flatMap(credentials -> WebClient.builder()
.build()
.post()
.uri(MY_URI)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(BodyInserters.fromFormData(credentials))
.exchange()
.flatMap(clientResponse -> clientResponse.bodyToMono(MyDataType.class)));
}

有一个注释。您不应该创建新的 WebClient对于每个请求。使用预定义WebClient.Builder来自 Spring Boot 的 bean 或重用您自己的一个实例。

关于java - 有没有办法将 Flux 作为表单数据提供给 WebClient 主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498024/

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