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

用Spring Reactive WebClient同时流式传输请求/响应主体?

郗亦
2023-03-14
Flux<Long> requests = Flux.interval(Duration.ofSeconds(2));

return WebClient.create()
        .post()
            .uri("/instructions")
            .contentType(MediaType.APPLICATION_STREAM_JSON)
            .body(requests, Long.class)
        .retrieve()
            .bodyToFlux(Object.class)
            .map(response -> {
                log.info("Received Response Object {}", response);
                return response;
            });

服务器是一个spring-boot-starter-webflux应用程序,具有路由处理程序,用于记录接收到的请求对象,并提供无限的结果流:

public Mono<ServerResponse> instructions(ServerRequest request) {
    // Log the request objects as they are received
    Flux<Object> requestStream = request.bodyToFlux(Object.class)
            .map(r -> {
                log.info("Received Request Object: {}", r);
                return r;
            });

    requestStream.subscribe();

    // Infinite stream of responses
    Flux<Long> responses = Flux.interval(Duration.ofSeconds(5));

    return ServerResponse.ok()
            .contentType(MediaType.APPLICATION_STREAM_JSON)
            .body(responses, Long.class);
}

当上面的代码运行时,服务器记录请求对象的无限流,但客户端从不记录任何响应对象。

如果通过执行以下操作绑定请求流:flux requests=flux.interval(duration.ofseconds(2)).take(20); ,那么客户机在收到所有请求后开始记录响应。

共有1个答案

晋涛
2023-03-14

请看这个问题:WebClient直到请求写入完成后才读取响应。

显然,基于Netty的WebClient只在发送完请求后才开始处理响应

Netty服务器也可能有类似的行为(只有在读取完请求正文后才开始发送响应),我不确定

 类似资料:
  • 问题内容: 我需要执行一个没有长度的八位字节流的api。它只是实时数据流。我遇到的问题是,当我发出请求时,似乎试图在将信息读入输入流之前先等待内容的结尾,但是它没有看到内容的结尾和NoHttpResponse异常的超时。以下是我的代码的简化版本: 问题答案: 编辑2 因此,如果您对线程/可运行程序/处理程序不满意,而对Android AsyncTask不满意,我将直接转到HttpUrlConnec

  • 我正在读一本书中关于C#中的响应-消息模式的章节,当我最近遇到一个使用web API的项目时,我注意到了一些相似之处,并想要一些明确的东西。 在书中,作者的代码将请求(在本例中是CustomerRequestService)包装在一个名为CustomerRequestService的类中,该类的工作是处理这些请求(请求只不过是具有与查找客户的服务相关的搜索词或属性的类,而不执行其他非常稀薄/贫乏的

  • 我打下面的url使用任何Rest客户端,我得到api响应:400坏请求与响应体 输入参数 但是java simple client没有显示响应主体。。下面是java代码。。它只给出了400个坏请求。

  • 我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者。 我想使用度量请求、响应和总时间。 我的示例请求如下所示: 目前我在Linux中使用命令来度量这个值: 但是time命令只测量总时间--这不是我想要的。 是否有任何方法可以使用来度量请求和响应时间?

  • 问题内容: 如何使用request下载文件内容,并使用aws-sdk for node直接将其流式传输到s3? 下面的代码给了我,这使得请求似乎没有返回可读流… 每个aws- sdk文件都 必须是一个对象。 我在这里做错了什么? 可以使用s3-upload-stream模块将其关闭,但是我希望限制我的依赖关系。 问题答案: 如果要手动侦听响应流,则要使用该对象:

  • 问题内容: 我正在玩弄所有花哨的node.js / mongodb / express平台,偶然发现一个问题: 您可能已经猜到了,对Mongodb 进行查询并返回游标 这会导致错误: 根据mongodb驱动程序doc,我试图将此转换器传递给: 但这无济于事。 谁能告诉我如何正确地将某些内容发送给响应? 还是唯一的解决方案是使用’data’和’end’事件手动抽取数据的样板? 问题答案: 这里的其他