Ktor HttpClient 支持分块传输编码

6

我正在使用Ktor HttpClient(CIO)对使用分块传输编码(chunked transfer encoding)的HTTP API进行请求。

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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接