【问题标题】:How to receive the response body as an InputStream in Unirest?如何在 Unirest 中将响应正文作为 InputStream 接收?
【发布时间】:2019-12-08 22:03:32
【问题描述】:

考虑以下示例:

import java.io.InputStream;
import kong.unirest.GetRequest;
import kong.unirest.HttpResponse;

class Download {
    private long byteCounter;
    private long contentLength;

    InputStream download(GetRequest request) {
        // no appropriate method here? --v
        HttpResponse response = request.??? 

        // get length to display some progress bar later ...
        // (not shown here)
        long contentLength = contentLengthHeader != null
          ? Long.valueOf(contentLengthHeader)
          : Long.valueOf(0);

        InputStream responseInputStream = response.getBody();
        return responseInputStream;
    }
}

在标记为??? 的位置上,我不知道调用哪个方法才能以InputStream 的形式接收响应正文。

request.asObject(InputStream.class) 之类的方法不起作用,因为此方法使用对象映射器将响应编组到 Java 类中(InputStream 当然没有)。

【问题讨论】:

    标签: java unirest


    【解决方案1】:

    您可以像这样获取原始响应输入流:

    HttpResponse<InputStream> response = request.asObject(raw -> raw.getContent());
    InputStream responseInputStream = response.getBody();
    

    如果您要求在 lambda 执行后不立即关闭输入流,则需要使用异步方法:

    CompletableFuture<HttpResponse<InputStream>> responseFuture = request.asObjectAsync(raw -> raw.getContent());
    HttpResponse<InputStream> response = responseFuture.get();
    InputStream responseInputStream = response.getBody();
    

    【讨论】:

    • 这不起作用,因为一旦执行了 lambda,底层连接就会被释放。所以是的,从技术上讲,您可以通过这种方式从 API 中获取 InputStream,但您几乎拿着一具死尸。
    • asObjectAsync 也不起作用,因为get 调用会将整个InputStream 读入内存,从而在检索大文件时导致内存不足错误。 :-(
    猜你喜欢
    • 2015-10-09
    • 2014-05-09
    • 1970-01-01
    • 2023-04-06
    • 2014-05-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多