我正在使用 Ktor HttpClient(CIO) 向 HTTP API 发出请求,该 API 的响应使用分块传输编码。
在调用使用分块传输编码的 API 时,是否可以使用 Ktor HttpClient(CIO) 来访问 HttpResponse 中的各个 Http 块?
我想迟到总比不到好:
httpClient.prepareGet("http://localhost:8080/").execute {
val channel = it.bodyAsChannel()
while (!channel.isClosedForRead) {
val chunk = channel.readUTF8Line() ?: break
println(chunk)
}
}
这个解决方案对我有用:
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)