gpt4 book ai didi

Ktor 响应流

转载 作者:行者123 更新时间:2023-12-04 11:44:23 31 4
gpt4 key购买 nike

我正在尝试调用一个 twitter 端点,该端点为您提供持续的 json 结果流回客户端
https://documenter.getpostman.com/view/9956214/T1LMiT5U#977c147d-0462-4553-adfa-d7a1fe59c3ec
我尝试像这样调用端点

        val url = "https://api.twitter.com/2/tweets/search/stream"
_streamChannel = _client.get<ByteReadChannel>(token, url) //Stops here

val byteBufferSize = 1024
val byteBuffer = ByteArray(byteBufferSize)

_streamChannel?.let {
while (_streamChannel!!.availableForRead > 0) {
_streamChannel!!.readAvailable(byteBuffer, 0, byteBufferSize)
val s = String(byteBuffer)
parseStreamResponseString(s).forEach {
emit(Response.Success(it))
}
}
}
我的 client.get代码是这个
suspend inline fun <reified T> get(authKey: String, url: String): T? {
val response = _client.get<HttpResponse>(url) {
header("Authorization", "Bearer $authKey")
}

when (response.status.value) {
in 300..399 -> throw RedirectResponseException(response)
in 400..499 -> throw ClientRequestException(response)
in 500..599 -> throw ServerResponseException(response)
}

if (response.status.value >= 600) {
throw ResponseException(response)
}

return response.receive<T>()
}
当我提出请求时,它只是坐在那里,我假设正在等待返回完整响应,然后再将其提供给我。
编辑
我也尝试使用 scoped streaming但它只是坐在线 readAvailable我知道有消息通过,因为当我通过 cURL 运行请求时我不断地获取数据
    _client.get<HttpStatement> {
header("Authorization", "Bearer $authKey")
url(urlString)
contentType(ContentType.Application.Json)
method = HttpMethod.Get
}.execute {
val streamChannel = it.receive<ByteReadChannel>()
val byteBufferSize = 1024
val byteBuffer = ByteArray(byteBufferSize)
streamChannel.readAvailable(byteBuffer, 0, byteBufferSize) // Stops here
val s = String(byteBuffer)
}
如何使用 Ktor 处理持续的 json 数据流?

最佳答案

据我所知,Ktor 客户端确实以 twitter 的流 API 要求的方式公开了对请求的 IO 缓冲区的访问。
来自推特文档 here :
某些 HTTP 客户端库仅在服务器关闭连接后才返回响应正文。这些客户端将无法访问 Streaming API。您必须使用将增量返回响应数据的 HTTP 客户端。大多数强大的 HTTP 客户端库都将提供此功能。例如,Apache HttpClient 将处理此用例。
你正在做的是告诉 Ktor 你得到的是一个 ByteReadChannel ,因此,一旦请求关闭(此 twitter 端点永远不会发生),Ktor 客户端将尝试使用您用来将数据解析为 ByteReadChannel 的任何插件(例如 json)。 .它也无法做到这一点,因为您从 twitter 获取的数据不是 ByteReadChannel,它是 json 对象的新行分隔列表。

关于Ktor 响应流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64830813/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com