我正在尝试集成新的Twitter API,特别是我的android应用程序中的流式推文部分,我正在使用Reform进行http调用。
当我试图打电话获取流媒体推文时,它只是挂起,不会返回任何内容。
这是我的改装电话
@Streaming
@GET("tweets/search/stream")
suspend fun getFilteredStream(@Header("Authorization") token:String)
然后我试着只使用OkHttp进行调用,如文档中所示。我得到了成功的响应,但我不知道如何流式传输数据。
我可以通过curl调用成功地进行调用,并且可以看到没有问题的数据。
如何通过改装或OkHttp 流式传输数据
更新:
使用OkHttp,我可以通过进行来获取数据
val client: OkHttpClient = OkHttpClient().newBuilder()
.build()
val request: Request = Request.Builder()
.url("https://api.twitter.com/2/tweets/search/stream")
.method("GET", null)
.build()
val response: Response = client.newCall(request).execute()
val source = response.body?.source()
val buffer = Buffer()
while(!source!!.exhausted()){
response.body?.source()?.read(buffer, 8192)
val data = buffer.readString(Charset.defaultCharset())
}
data
保存多个tweet对象的字符串数据表示,但我如何一次读取一条tweet,或者像这样解析响应?
从文档中,我认为您需要将现有的两个示例结合起来。
https://github.com/square/retrofit/blob/108fe23964b986107aed352ba467cd2007d15208/retrofit/src/main/java/retrofit2/http/Streaming.java
按原样处理返回{@link ResponseBody ResponseBody}的方法的响应正文,即不将正文转换为{@code byte[]}。
和示例调用代码
https://github.com/square/retrofit/blob/108fe23964b986107aed352ba467cd2007d15208/retrofit/src/test/java/retrofit2/CallTest.java#L599
我怀疑,依赖于您使用的JSON API,您可能能够从响应主体使用Streaming API。但如果没有,你可以在换行符或换行符后面跟着{,然后在下一行单独解析。对不起,我在这里帮不上忙。
请参阅https://en.wikipedia.org/wiki/JSON_streaming#Concatenated_JSON