Ktor HttpClient 支持分块传输编码

问题描述 投票:0回答:2

我正在使用 Ktor HttpClient(CIO) 向 HTTP API 发出请求,该 API 的响应使用分块传输编码。

在调用使用分块传输编码的 API 时,是否可以使用 Ktor HttpClient(CIO) 来访问 HttpResponse 中的各个 Http 块?

kotlin httpclient chunked-encoding ktor
2个回答
0
投票

我想迟到总比不到好:

httpClient.prepareGet("http://localhost:8080/").execute {
    val channel = it.bodyAsChannel()
    while (!channel.isClosedForRead) {
        val chunk = channel.readUTF8Line() ?: break
        println(chunk)
    }
}

0
投票

这个解决方案对我有用:

fun readByChunks(url: String, client: HttpClient) = flow {
    client.preparePost(url).execute {
        val channel: ByteReadChannel = it.body()
        while (!channel.isClosedForRead) {
            val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
            channel.readAvailable(buffer)
            val trimmed = buffer.dropLastWhile { it == 0.toByte() }.toByteArray()
            emit(String(trimmed))
        }
    }
}

用途:

 val client = HttpClient(CIO)
 readByChunks("https://example.net/path/to/stream", client).onEach {
    println("$it")
 }.launchIn(YourCoroutineScope)
© www.soinside.com 2019 - 2024. All rights reserved.