我是GraphQL的新手,所以我想在开始自己的项目之前先进行测试。作为测试数据库,我正在使用Prisma测试数据库和服务以及Apollo Android作为应用程序中的库。 query
和mutation
几乎已经完成。作为下一个 ,我想对subscription
做些事情。因此,我的graphql订阅看起来像:
subscription observer {
post {
mutation
node {
id
title
text
isPublished
}
}
}
随着Apollo Android库基于我的graphql代码生成一些类,我尝试使用observer
订阅,如下所示:
Interceptor interceptor = chain -> chain.proceed(chain.request());
OkHttpClient ohc = new OkHttpClient.Builder().addInterceptor(interceptor).build();
ApolloClient mApolloClient = ApolloClient.builder().serverUrl(ENDPOINT).okHttpClient(ohc).build();
mApolloClient.subscribe(ObserverSubscription.builder().build()).execute(new ApolloSubscriptionCall.Callback<ObserverSubscription.Data>() {
@Override
public void onResponse(@NotNull Response<ObserverSubscription.Data> response) {
// do work here
}
@Override
public void onFailure(@NotNull ApolloException e) {
// catch exception
}
@Override
public void onCompleted() {
// some other stuff goes here
}
});
在执行此代码时会引发以下异常:
java.lang.IllegalStateException:未配置订阅管理器
我的问题是,有什么方法可以在Android应用中通过apollo-android使用订阅?
答案 0 :(得分:0)
首先,很抱歉为您提供最新的答案,我只是陷入了相同(或至少相同的错误)问题,并且使用了许多站点的信息,因此我成功进行了订阅。
配置ApolloClient时,需要定义一些额外的参数:
Map<String, Object> connectionParams = new HashMap<>();
return ApolloClient.builder()
.serverUrl(urlBaseDeDatos)
.normalizedCache(normalizedCacheFactory(),cacheKeyResolver())
.okHttpClient(okHttpClient())
.subscriptionConnectionParams(connectionParams)
.subscriptionTransportFactory(new WebSocketSubscriptionTransport.Factory(urlBaseDeDatos, okHttpClient()))
.build();
最后两个是重要的,因为它们控制着您的订阅(或者我认为是的),一旦我定义了这两个,就可以进行订阅。我的connectionParams为空,因为我没有使用auth令牌或类似的令牌。
现在,进行订阅:
private Flowable<Response<TaskStatusChangedSubscription.Data>> subscription(){
apolloClient.clearNormalizedCache();
return Rx2Apollo.from(apolloClient.subscribe(TaskStatusChangedSubscription
.builder()
.build()));
}
使用Apollo.subscribe方法和来自RxJava的一些帮助,并在相同功能或其他功能(如一次性使用)上执行.subscribe(),就可以正常流动。
最后(对不起,您以前的所有解释都可以,但可能会对其他人有所帮助),如果将您的阿波罗生成器更改为此,则应该解决您的问题:
Map<String, Object> connectionParams = new HashMap<>();
ApolloClient mApolloClient = ApolloClient.builder().serverUrl(ENDPOINT).okHttpClient(ohc).subscriptionConnectionParams(connectionParams)
.subscriptionTransportFactory(new WebSocketSubscriptionTransport.Factory(ENDPOINT, okHttpClient()))
.build();