当前位置: 首页 > 知识库问答 >
问题:

Web客户端响应处理程序(均成功

融泓
2023-03-14

使用OkHttp实现异步RESTAPI客户机,工作正常。出于好奇,尝试将其转换为WebClient,观察奇怪的行为。

WebClient配置就是这样:

webClient = WebClient.builder()
    .defaultHeaders(headers -> headers.add(HttpHeaders.CONTENT_TYPE,
        org.springframework.http.MediaType.APPLICATION_JSON_VALUE))
    .clientConnector(new ReactorClientHttpConnector(builder -> builder
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, timeout)))
    .build();

请求代码:

void getTokenWithWebClient(Consumer<Try<String>> callback) {
    webClient.post()
        .uri(url)
        .syncBody(new MyRequest())
        .retrieve()
        .onStatus(status -> status.value() != HttpStatus.OK.value(),
            rs -> rs.bodyToMono(String.class).map(body -> new IOException(String.format(
                "Response HTTP code is different from 200: %s, body: '%s'", rs.statusCode(), body))))
        .bodyToMono(MyResponse.class)
        .subscribe(rs -> callback.accept(Try.of(() -> validateResponse(Option.of(rs)))),
            ex -> callback.accept(Try.failure(ex)));
}

在单元测试中,作为参数传递给此方法的回调完成了一个Future,我等待它。因此,当我在IDEA中运行测试时,请求产生一个响应,响应的正文为空(内容长度:0),subscribe()中的lambda永远不会执行-使用println调试进行验证。

但是,当我调试同一个测试时,即使没有设置任何断点,它也会按预期完成,并根据结果调用lambda。

我确实在日志中看到了这一点:

[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClientOperations - [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522] Received last HTTP packet
[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClient - [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522] USER_EVENT: [Handler Terminated]
[reactor-http-nio-4] DEBUG reactor.ipc.netty.channel.ChannelOperationsHandler - [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522] Disposing context reactor.ipc.netty.channel.PooledClientContextHandler@3547abe3
[reactor-http-nio-4] DEBUG reactor.ipc.netty.channel.PooledClientContextHandler - Releasing channel: [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522]
[reactor-http-nio-4] DEBUG reactor.ipc.netty.resources.DefaultPoolResources - Released [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522], now 0 active connections
[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClient - [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522] READ COMPLETE
[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClient - [id: 0xeffaded6, L:/127.0.0.1:49265 - R:localhost/127.0.0.1:58522] READ COMPLETE
[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClient - [id: 0xeffaded6, L:/127.0.0.1:49265 ! R:localhost/127.0.0.1:58522] CLOSE
[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClient - [id: 0xeffaded6, L:/127.0.0.1:49265 ! R:localhost/127.0.0.1:58522] INACTIVE
[reactor-http-nio-4] DEBUG reactor.ipc.netty.http.client.HttpClient - [id: 0xeffaded6, L:/127.0.0.1:49265 ! R:localhost/127.0.0.1:58522] UNREGISTERED

但是,我的错误单声道卡在某个地方。

在Windows 7、Oracle JDK8 x64、IDEA 2018上运行此功能。选项/尝试是vavr类(io.vavr:vavr),与本案例无关。对于单元测试,我使用Ratpack模拟讨论中的RESTAPI。

尝试使用exchange()而不是retrieve()并检查subscribe()lambda中的状态代码,而不使用onStatus()-结果相同。

有什么想法吗?

共有1个答案

赫连棋
2023-03-14

长话短说,rs.bodytomino(String.class)。defaultIfEmpty(“”)保存了当天

 类似资料:
  • 但是,我不确定为什么它不输出get请求的值?它实际上并不触发endpoint。

  • 我正在尝试处理下游服务抛出的异常并捕获错误代码以及错误响应消息。在网上搜索了一些解决方案后,我看到了下面处理异常的常用方法,但我真的不确定我必须在我的MyCustomConnectionException中写些什么?顺便说一下,当我使用Resttemplate时,我可以通过抛出HttpClientResponseException来轻松地处理并捕获所有内容,但我真的不知道这是如何工作的?我是使用W

  • 我正在spring应用程序中使用web客户端 我在执行相同操作时面临内存泄漏问题 我正在使用下面的代码获取来自服务的非2xx响应的响应体: 我的问题是,如果我在responseMono上使用dispose方法,处理过程需要很长的时间,而没有它,我会面临内存泄漏问题。我在这里做错什么了吗?

  • 只是想知道有没有办法得到spring Web-Flux的web客户端的响应时间?

  • 在SpringJSFWeb应用程序中将Netty客户端处理程序配置为消息接收点,有没有具体的方法? 如果一些独立的Java应用程序充当Netty服务器,我如何接收到SpringJSFWeb应用程序的消息?

  • 问题内容: 我目前正在将代码从Jboss7迁移到Wildfly10。 服务器本身完全可以启动。当尝试将我们的客户端与正在运行的新wildfly10服务器进行ejb-remote调用连接时,它将无法正常工作。 我唯一要使用的是以下错误: org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector setupEJBReceiver