【问题标题】:How to HTTP POST a Flux<String> as a JSON array using Spring's WebClient?如何使用 Spring 的 WebClient 将 Flux<String> 作为 JSON 数组进行 HTTP POST?
【发布时间】:2019-01-14 18:35:18
【问题描述】:

如何使用 Spring 的反应式 WebClientFlux&lt;String&gt; 作为 JSON 数组发布?

Flux<String> stringFlux = Flux.fromIterable(objects).map(MyObject::getSomeString);

WebClient.create(baseUrl)
  .post()
  .uri(myUrl)
  .contentType(MediaType.APPLICATION_JSON)
  .body(stringFlux, String.class)
  .exchange()
  .flatMap(response -> {
     if (response.statusCode().is2xxSuccessful()) {
       // Do something
     }
     return response.bodyToMono(Void.class);
   })
   .block();

这会发送请求,但不会将其作为 JSON 字符串数组发送。

我看到有另一个body() 签名接受ParameterizedTypeReference,所以我尝试了这个:

.body(stringFlux.collectList(), new ParameterizedTypeReference&lt;&gt;() {})

但这实际上会导致编译错误(我使用的是 Java 11):

Error:java: com.sun.tools.javac.code.Types$FunctionDescriptorLookupError.

有什么想法吗?

【问题讨论】:

    标签: java spring-webflux project-reactor


    【解决方案1】:

    好吧,我会被诅咒的。我使用ParameterizedTypeReference 让它工作。通常情况下,编译错误总结了它。我在声明new ParameterizedTypeReference&lt;&gt;() {} 时省略了类型参数。提供类型就可以了,并将我的 Flux&lt;String&gt; 发布为 JSON 数组:

    .body(stringFlux.collectList(), new ParameterizedTypeReference&lt;List&lt;String&gt;&gt;() {})

    IntelliJ 告诉我这种类型是推断出来的,但显然不是。

    【讨论】:

      【解决方案2】:

      你可以在没有ParametrizedTypeRefrence 的情况下使用List.class 来处理字符串。

      .body(stringFlux.collectList(), List.class)
      

      【讨论】:

        【解决方案3】:

        投票的解决方案似乎没有产生上述结果。这似乎流式传输 JSON 对象列表(这是 Webclient 的用途),而不是发送 JSON 数组结构。 我使用该技术得到的结果是:

        {}{}{}{}
        

        JSON 数组输出将是:

        [{}, {}, {}, {}]
        

        除非我错过了什么。

        【讨论】:

          【解决方案4】:
          .body(BodyInserters.fromFormData(stringFlux))
          

          不确定这是否是正确的答案。 我可以将 List 作为正文发送

          【讨论】:

            猜你喜欢
            • 2017-10-27
            • 2019-08-26
            • 2020-09-27
            • 1970-01-01
            • 1970-01-01
            • 2013-03-13
            • 1970-01-01
            • 2017-06-19
            • 1970-01-01
            相关资源
            最近更新 更多