gpt4 book ai didi

java - Spring WebFlux - 为什么我必须等待 WebClient 响应?

转载 作者:行者123 更新时间:2023-12-05 06:54:40 27 4
gpt4 key购买 nike

我有一个如下所示的 WebClient 类:

public class WebClientSample {

public static void main(String[] args) throws InterruptedException {
System.out.println(mySimpleTestMethod());
}

public static String mySimpleTestMethod() throws InterruptedException {
String uri = "http://localhost:8080/some/cool/api/here";
WebClient webClient = WebClient.create(uri);
Mono<String> result = webClient
.get()
.headers(headers -> headers.setBasicAuth("admin", "secret"))
.retrieve()
.bodyToMono(String.class);
String responseStr = result.subscribe(response -> System.out.println(response)).toString();
Thread.sleep(1000);
return responseStr;
}

}

执行后我在我的控制台上得到这个:

{"some":{"cool":json,"response":{"foo":"bar",...}}}
reactor.core.publisher.LambdaMonoSubscriber@60b71e8f

问题:如果我评论 Thread.sleep(1000); 然后我没有得到任何回应。为什么我需要等待响应?

最佳答案

您的代码与 Thread.sleep(1000); 一起工作,因为您阻塞了父线程一段时间,并且在这段时间内您从 WebClient 获得了响应。

WebClient 是一个非阻塞的 HTTP 客户端。由于您需要从 mySimpleTestMethod 方法返回响应,因此您需要阻塞直到使用 Mono#block() 检索响应。

String responseStr = result.block();

然后您可以返回响应。

此外,请注意,在下面的代码中,您在一次性类型 (LambdaMonoSubscriber) 上调用 toString,LambdaMonoSubscriber 不会覆盖 toString 方法,因此,您是从 Object 类的 toString 方法获取字符串值 (reactor.core.publisher.LambdaMonoSubscriber@60b71e8f)。

String responseStr = result.subscribe(response -> System.out.println(response)).toString();

关于java - Spring WebFlux - 为什么我必须等待 WebClient 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65481243/

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