【问题标题】:Apache HTTPClient - consume an indefinite HTTP GET StreamApache HTTPClient - 使用无限期的 HTTP GET 流
【发布时间】:2020-05-18 15:07:44
【问题描述】:

英国的Companies House 最近发布了HTTP 'stream' webservice,让开发人员可以无限期地听取公司的变更。

下面是他们帮助页面的重要部分

建立与流式传输 API 的连接需要创建一个 长时间运行的 HTTP 请求,并逐步处理每个响应 线。从概念上讲,您可以将其视为无限下载 HTTP 上的长文件。

使用 Apache HTTP 客户端,我可以使用以下 kotlin 代码在 http 客户端库的调试控制台输出中看到公司更改的“流”

val httpClient = HttpClients.createDefault()
    val request = HttpGet("https://stream.companieshouse.gov.uk/companies")
    request.addHeader("Authorization", "xxxxxxxxxxxxx");
    httpClient.execute(request).use { response1 ->
        val entity: HttpEntity = response1.entity
        entity.content?.use { inputStream -> println("output-->" + String(inputStream.readAllBytes())) }
    }

但是,我的控制台输出永远不会被命中(即上面的'output-->'的打印字符串)

问题:使用 Apache HTTP 客户端,是否可以使用无限期的 HTTP Get 连接?如果是这样,怎么做?

【问题讨论】:

    标签: java kotlin httpclient apache-httpclient-4.x


    【解决方案1】:

    您可以通过使用从 http 响应实体无限返回的流来实现此行为。

    这是一个 Java 示例,说明您将如何做到这一点。

        var request = new HttpGet("https://stream.companieshouse.gov.uk/companies");
        request.addHeader(HttpHeaders.AUTHORIZATION, auth);
    
        try (var stream = client.execute(request).getEntity().getContent()) {
            var buffered = new BufferedReader(new InputStreamReader(new BufferedInputStream(stream)));
    
            while (true) {
    
              String value = buffered.readLine();
    
              if(!value.isBlank()) {
                System.out.printf("Event: %s ", value);
              }
            }
        }
    

    应该可以将 sn-p 转换成 Kotlin。

    【讨论】:

    • 如果我想处理前 5 个响应然后我完成了,应该如何结束流? client.close()?
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多