【问题标题】:How to use webclient in spring webflux to download pdf file in a rest api如何在spring webflux中使用webclient在rest api中下载pdf文件
【发布时间】:2019-01-17 14:53:01
【问题描述】:

我有一个rest api,它将从网站下载pdf文件,然后将pdf文件返回给调用者。

使用以下代码,我可以从 api 获取Mono<ClientResponse>

Mono<ClientResponse> requestSpec1 = WebClient
            .create()
            .method(HttpMethod.GET)
            .uri("<url>")
            .accept(MediaType.APPLICATION_PDF)
            .exchange();

但是,如果我尝试使用 block() 方法从 requestSpec1 获取 ClientResponse,我得到一个异常说 ClientResponse block()/blockFirst()/blockLast() 正在阻塞,这是不支持的在线程中...

谁能帮忙解决这个问题。

【问题讨论】:

  • 请将导致问题的代码部分发布在您阻止它的位置
  • @Barath ClientResponse response = requestSpec1.block();
  • 理想情况下,您希望它是非阻塞的。有什么理由要阻止它吗?您也可以尝试链接块.exchange().block()。这里还有一些不错的建议SO。提供你的完整代码,看起来你是在主线程上直接调用块。
  • 我使用block() 方法获取ClientResponse 对象,然后我可以从中获取pdf文件名、文件正文等。如果没有block() 方法,我不知道如何获得那里的信息,这是我的问题。
  • 你可以使用.exchange().flatmap(),然后用它来处理你想要做的事情。

标签: spring spring-webflux project-reactor


【解决方案1】:

您似乎正试图在反应管道中间的响应上调用block()。如果没有更多细节或代码 sn-p,我只能假设您是在响应式 Controller 方法的中间执行此操作。

从 Reactor Core 3.2.0 开始,blocking inside a Thread that belongs to a Scheduler will thrown an exception like this。相反,您应该尝试编写一个完整的反应式管道和链式运算符,例如在本例中为 mapflatMap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2020-12-18
    • 2018-05-09
    • 2021-02-09
    • 2017-06-10
    • 2018-02-24
    • 2022-09-23
    • 2019-01-26
    相关资源
    最近更新 更多