Java 有没有一种方法可以为网络客户端提供流量';s体作为表单数据?

Java 有没有一种方法可以为网络客户端提供流量';s体作为表单数据?,java,spring-webflux,project-reactor,Java,Spring Webflux,Project Reactor,我想使用WebClient访问一些受限资源,因此需要提供登录名和密码,并将其编码为表单数据。它就是这样工作的 private Mono<MyDataType> getMyDataType() { return WebClient.builder().build().post() .uri(MY_URI) .contentType(MediaType.APPLICATION_FORM_URLENCODED)

我想使用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);
}
private Mono getMyDataType(){
返回WebClient.builder().build().post()
.uri(MY_uri)
.contentType(MediaType.APPLICATION\u FORM\u URLENCODED)
.body(BodyInserters.fromFormData(getFormData()))
.exchange()
.flatMap(clientResponse->clientResponse.bodytomino(MyDataType.class));
}
私有多值映射getFormData(){
多值映射凭据=新建LinkedMultiValueMap();
添加(“登录”,readLoginStringFromDiskAsString);
添加(“密码”,readPasswordStringFromDiskAsString);
}
但是,正如您所看到的,我的
read*
函数是阻塞-简单的
文件.readAllBytes
,就像您在任何其他应用程序中所做的那样。 我想将这种读取从磁盘转换为更异步的方式,比如使用DataBufferUtils或类似的方式。问题是,Spring只提供了一个
fromFormData
-
fromFormData(多值映射formData)
的实现


有没有办法真正做到这一点?

您可以更改
getFormData
方法以返回
Mono
并将其结果平面映射为异步访问凭据

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)));
}
private Mono getFormDataNonBlocking(){
//异步非阻塞读取凭据
}
私有Mono getMyDataType(){
返回getFormDataNonBlocking()
.flatMap(凭据->WebClient.builder()
.build()
.post()
.uri(MY_uri)
.contentType(MediaType.APPLICATION\u FORM\u URLENCODED)
.body(BodyInserters.fromFormData(凭证))
.exchange()
.flatMap(clientResponse->clientResponse.bodytomino(MyDataType.class));
}

有一个音符。您不应该为每个请求创建新的
WebClient
。使用Spring Boot中预定义的
WebClient.Builder
bean或重用您自己的一个实例。

不幸的是,它可能不是一个
Mono
,而是一个
MultiValueMap
,这是一个让人头疼的问题。