我正在尝试使用REST API [1],它将服务器发送的事件发送到客户端。我目前正在使用从广场改造消费这一点,但我不知道如何做到这一点。有经验的人能帮忙吗?如果没有改进,请推荐其他可以做到这一点的Java库。 [1] https://mesosphere.github.io/marathon/docs/rest-api.html#get-v2-events
public interface NotificationAPI {
@GET("notifications/sse")
Call<InputStream> getNotificationsStream(@retrofit2.http.Query("Last-Event-ID") String lastEventId);
}
我为InputStream写了一个快速转换器工厂:
public class InputStreamConverterFactory extends Converter.Factory {
private static class InputStreamConverter implements Converter<ResponseBody, InputStream> {
@Nullable
@Override
public InputStream convert(ResponseBody value) throws IOException {
return value.byteStream();
}
}
@Override
public @Nullable
Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (type.equals(InputStream.class)) {
return new InputStreamConverter();
}
return null;
}
}
我的客户端代码看起来像这样:
var cinputStream = api.getNotificationsStream(null);
var inputStream = cinputStream.execute().body();
try(var sseStream = new MySSEStreamParser(inputStream)) {
//handle the stream here...
}
4条答案
按热度按时间o2gm4chl1#
试试这个库:oksee。
OkSse是OkHttp的扩展库,用于创建服务器发送事件(SSE)客户端
因为我经历了同样的问题,从我的研究,这是最好的选择,现在,因为翻新不支持它。
https://github.com/heremaps/oksse
btxsgosb2#
我知道这是个老问题。但是我没有找到一个完整的例子,现在试着用我的代码来提供它。我们只使用
retrofit
和coroutines
1.在
retrofit API interface
中需要添加代码。注意我们使用的@Streaming
和返回类型Call<ResponseBody>
2.在你的
repository
类中需要添加此代码。注意我们使用flow
并读取stream
。要理解带有有效负载的消息已经到达,它必须以"data:"
开始3.最后一步,我们需要在
ViewModel
中收集数据。我们只需要从repository
调用方法这就是全部,不需要额外的库。
j2qf4p5b3#
没有真实的将Retrofit和SSE混为一谈。使用reflect获取一个输入流,然后查找(或编写)一个将SSE事件分块的输入流解析器。
在reflect中,我有这个:
我为
InputStream
写了一个快速转换器工厂:我的客户端代码看起来像这样:
有一个OkHttp SSE解析器,您可能会使用它。然而:
wh6knrhe4#
下面是一个稍微更新的方法,我刚刚基于this博客开始工作。它使用Retrofit的
@Streaming
,带有Kotlin流和缓冲读取器。SseHeartbeatData只是sse端点返回的自定义json负载。}
然后,您可以在视图模型中收集它,并根据需要处理异常。