android graphQL 阿波罗

Posted

技术标签:

【中文标题】android graphQL 阿波罗【英文标题】:android graphQL apollo 【发布时间】:2017-10-15 08:38:12 【问题描述】:

我正在使用 apollo-GraphQL 进行 API 响应。我在拦截器类中设置了令牌。在主要活动中,我使用的是 apolloClient,我在其中传递查询以获取数据。

我从拦截器类获得 API 响应,但没有获得查询响应。

public class HttpInterceptor implements Interceptor 

    @Override public Response intercept(Interceptor.Chain chain) throws IOException 

        java.util.logging.Logger logger = java.util.logging.Logger.getLogger("okhttp");
        String BASE_URL = "url_example.json";
        Response response = null;
        Request request = chain.request();

        request =chain.request();

        request = request.newBuilder()
                .url(BASE_URL)
                .header("token_key", "token_value")
                .build();

        long t1 = System.nanoTime();

        logger.info(String.format("Sending request %s on %s%n%s",
                request.url(), chain.connection(), request.headers()));
        response = chain.proceed(request);

        long t2 = System.nanoTime();

        logger.info(String.format("Received response for %s in %.1fms%n%s",
                response.request().url(), (t2 - t1) / 1e6d, response.headers()));
        return response;
    

Application类代码:

private static final String BASE_URL = "url_example.json";
private ApolloClient apolloClient;

@Override public void onCreate() 
    super.onCreate();

    OkHttpClient okHttpClient  = new OkHttpClient.Builder()
            .addInterceptor(new HttpInterceptor())
            .build();

    apolloClient = ApolloClient.builder()
            .serverUrl(BASE_URL)
            .okHttpClient(okHttpClient)
            .build();


public ApolloClient apolloClient() 
    return apolloClient;

代码或 MainActivity:

 protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        application = (SampleApplication) getApplication();

        content = (ViewGroup) findViewById(R.id.rl_content_holder);
        progressBar = (ProgressBar) findViewById(R.id.loading_bar);
        RecyclerView collectionRecyclerView = (RecyclerView) findViewById(R.id.rv_collection_list);
        mCollectionAdapter = new CollectionAdapter(this);
        collectionRecyclerView.setAdapter(mCollectionAdapter);
        collectionRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        fetchCollection();
    

    ApolloCall.Callback<ShopifyCollections.Data> mDataCallback =
            new ApolloCall.Callback<ShopifyCollections.Data>() 
        @Override
        public void onResponse(@Nonnull com.apollographql.apollo.api.Response<ShopifyCollections.Data> response) 
            Log.i("Shopify CallBack",response.toString());
        

        @Override
        public void onFailure(@Nonnull ApolloException e) 
            Log.e(TAG, e.getMessage(), e);

        
    ;

    public  void fetchCollection()

        mHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new HttpInterceptor())
                .build();
        ShopifyCollections collectionQuery = ShopifyCollections.builder()
                .limit(250)
                .build();
        collectionCall = application.apolloClient().newCall(collectionQuery);
        collectionCall.enqueue(mDataCallback);

查询:

query ShopifyCollections($limit: Int!)
    shop
        name
        collections(first: $limit)

            edges
                node
                    title
                    id
                  image
                    src
                  
                
            
        
    

【问题讨论】:

【参考方案1】:

我看到您正在尝试使用 Shopify 店面 GraphQL 架构编写示例?如果是,那么您可以在以下位置找到示例:https://github.com/Shopify/mobile-buy-sdk-android/tree/develop-v3/MobileBuy/sample

它还没有完成,但可以给你一些概述。

如果问题与如何将身份验证令牌附加到标头有关:

OkHttpClient httpClient = new OkHttpClient.Builder()
      .addInterceptor(chain -> 
        Request original = chain.request();
        Request.Builder builder = original.newBuilder().method(original.method(), original.body());
        builder.header("User-Agent", "Android Apollo Client");
        builder.header("X-Shopify-Storefront-Access-Token", shopifyApiKey);
        return chain.proceed(builder.build());
      )
      .build();

apolloClient = ApolloClient.builder()
      .okHttpClient(httpClient)
      .serverUrl(HttpUrl.parse("https://" + shopUrl + "/api/graphql"))
      .withCustomTypeAdapter(CustomType.MONEY, new CustomTypeAdapter<BigDecimal>() 
        @Override public BigDecimal decode(final String value) 
          return new BigDecimal(value);
        

        @Override public String encode(final BigDecimal value) 
          return value.toString();
        
      )
      .build();

【讨论】:

以上是关于android graphQL 阿波罗的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 graphq-request 表示嵌套对象输入类型的数组

如何在 android 客户端中使用 graphql 订阅

http解析异常阿波罗Graphql

如何连续进行 graphql 调用?反应阿波罗

Graphql 阿波罗联盟

反应中的奇怪错误-使用阿波罗/客户端-graphql