使用Micronaut声明性客户端从Flowable响应中获取标头

时间:2019-12-11 23:00:24

标签: grails micronaut

我正在使用Micronaut声明性客户端在grails 4应用程序中使用后端API。我已经成功实现了一些GET / POST / PUT和DELETE请求,但是现在我想实现一个下载端点,该端点返回了一个沉重的zip文件,因此我尝试使用:

@Get(value = '/download/{zipFileId}', processes = 'application/zip')
abstract Flowable<ByteBuffer<?>> downloadZip(Long zipFileId)

它可以工作,但是我不知道如何从该响应中获取某些标题,例如“ Content-Length”,所以我的问题是,有一种方法可以使用Micronaut Declarative Client从Flowable响应中获取标题。 ?

我尝试了低级客户端,它正在与:

Flowable<HttpResponse<ByteBuffer<?>>> response = rxStreamingHttpClient.exchangeStream(request)
response.blockingSubscribe(new Subscriber<HttpResponse<ByteBuffer<?>>>() {
    int number = 0

    ...

    @Override
    void onNext(HttpResponse<ByteBuffer<?>> httpResponse) {
        ByteBuffer<?> buffer = byteBufferHttpResponse.body()
        if(number == 0) {
            httpServletResponse.setHeader('Content-Length', httpResponse.headers.get('Content-Length'))
        }
        IOUtils.copyLarge(buffer.toInputStream(), httpServletResponse.getOutputStream())
        ((ReferenceCounted) buffer).release()
        number++
        subscription.request(1)
    }

    ...

})

我在声明性客户端中尝试使用

@Get(value = '/download/{zipFileId}', processes = 'application/zip')
Flowable<HttpResponse<ByteBuffer<?>>> downloadZip(Long zipFileId)

但是看起来客户端在订阅者中调用onNext之前,客户端已经下载了所有文件(并且我得到了

io.netty.util.IllegalReferenceCountException: refCnt: 0

当我尝试访问缓冲区时

1 个答案:

答案 0 :(得分:0)

如果要获取响应数据,但还可以流式传输内容,则可以执行以下操作:

HttpResponse<Flowable<ByteBuffer<?>>> downloadZip(Long zipFileId)

然后您可以订阅该响应主体