我正在使用Ktor HttpClient(CIO)对使用分块传输编码(chunked transfer encoding)的HTTP API进行请求。
在调用使用分块传输编码的API时,是否可以使用Ktor HttpClient(CIO)以获取HttpResponse中各个Http Chunk的访问权限?
我正在使用Ktor HttpClient(CIO)对使用分块传输编码(chunked transfer encoding)的HTTP API进行请求。
在调用使用分块传输编码的API时,是否可以使用Ktor HttpClient(CIO)以获取HttpResponse中各个Http Chunk的访问权限?
迟做总比不做好:
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)