我正在使用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
当我尝试访问缓冲区时
答案 0 :(得分:0)
如果要获取响应数据,但还可以流式传输内容,则可以执行以下操作:
HttpResponse<Flowable<ByteBuffer<?>>> downloadZip(Long zipFileId)
然后您可以订阅该响应主体