GraphQL:配置订阅管理器

时间:2018-12-26 07:43:01

标签: java android graphql apollo-android

我是GraphQL的新手,所以我想在开始自己的项目之前先进行测试。作为测试数据库,我正在使用Prisma测试数据库和服务以及Apollo Android作为应用程序中的库。 querymutation几乎已经完成。作为下一个 ,我想对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:未配置订阅管理器

此消息来自here,与this直接相关。

我的问题是,有什么方法可以在Android应用中通过apollo-android使用订阅?

1 个答案:

答案 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();