You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vert.x HttpClient中rxSend与send的差异及适用场景

Vert.x HttpClient:rxRequest/rxSend与request/send的差异及适用场景

你提到的两段代码从表面行为看确实一致,都会发起GET请求并处理响应体,但底层的执行时机和管控能力有本质区别,结合实际开发场景,选择逻辑如下:

核心差异回顾

  • rxRequest()/rxSend() 返回冷Observable:仅在调用subscribe()时才会触发实际的网络请求,定义阶段只是构建执行链
  • request()/send() 内部调用rx*方法并立即订阅:代码执行到该方法时就会立刻发起请求,无需等待后续的subscribe()

两段对比代码

// 使用rxRequest/rxSend的版本
RecordParser parser = RecordParser.newDelimited("\n", h -> log.info("r={}", h.toString()));
client
    .rxRequest(HttpMethod.GET, sut.actualPort(), "localhost", "/stream?file=stream2.txt")
    .flatMap(request -> request.rxSend().flatMap(HttpClientResponse::body))
    .subscribe(
        body -> {
          parser.handle(body.getDelegate());
          ctx.completeNow();
        },
        ctx::failNow);

// vs 使用request/send的版本
RecordParser parser = RecordParser.newDelimited("\n", h -> log.info("r={}", h.toString()));
client
    .request(HttpMethod.GET, sut.actualPort(), "localhost", "/stream?file=stream2.txt")
    .flatMap(request -> request.send().flatMap(HttpClientResponse::body))
    .subscribe(
        body -> {
          parser.handle(body.getDelegate());
          ctx.completeNow();
        },
        ctx::failNow);

何时使用rxRequest()/rxSend()

  • 需要延迟执行请求:比如要等待用户交互事件、其他异步任务完成后再发起请求,可先构建Observable链,触发条件满足时再调用subscribe()
  • 复用请求逻辑:将请求封装为Observable对象,在多个业务场景按需订阅,每次订阅都会发起新的独立请求
  • 组合多异步操作:借助RxJava操作符(如flatMap、zip、concat)实现并行请求、依赖请求等复杂异步流程,rx*方法能更好地融入RxJava的响应式体系
  • 精细管控请求生命周期:需要随时取消请求(通过Disposable)、添加错误重试、自定义线程调度等逻辑时,冷Observable的特性让你能在订阅前完成所有配置

何时使用request()/send()

  • 简单即时请求:无需延迟执行、无需复杂异步组合的场景,用request()/send()更简洁,省去手动管理订阅时机的代码
  • 线性业务逻辑:在流程清晰的简单业务中,即时发起请求能让代码逻辑更直观,减少响应式API带来的额外理解成本

内容的提问来源于stack exchange,提问作者kodstark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:03:27