[譯] Hello Apollo: 建立一個使用 GraphQL 的 Android App

Shawnlee發表於2017-12-29

如果你是一個移動應用開發人員,你一定明白更快的API和更快的應用程式的重要性。特別是在資料流量比較貴的國家,只獲取所需的資料變得尤為重要。

但是,API是為多種客戶端設計的,每種客戶端都有不同的要求,大多數情況下你會發現這些API都沒有針對移動應用進行優化。這就是像GraphQL這樣的新技術可以提供幫助的地方。

GraphQL是一種針對API的查詢語言,它能讓客戶端精確地獲得他們需要的資料。如果你還不瞭解GraphQL,可以通過以下連結檢視更多內容。graphql.org/.

GraphQL on Android

讓我們來看看如何在安卓平臺上使用GraphQL API。儘管網上有很多網路請求的第三方庫,但是目前為止安卓平臺上只有一個GraphQL庫:Apollo.

Apollo Android是一個很棒的GraphQL庫,可以讓使用GraphQL API變得更容易。它有兩個主要的元件:

  • Apollo程式碼生成(Apollo Codegen)。這個元件是一個能像ButterKnife一樣生成程式碼的gradle外掛,apollo codegen在編譯時從標準graphql查詢生成Java model。
  • 網路和快取(Networking/Caching)。Apollo Android的另一個元件是網路和快取部分,它負責與你的GraphQL API進行所有的網路通訊,將返回的資料解析成正確的model,使你能夠將動態資料傳遞給你的GraphQL查詢和響應快取。

Hello World

現在我們知道什麼是GraphQL,以及Apollo Android的工作原理。接下來讓我們看看如何將Apollo整合到我們的安卓應用裡面吧。

如果你還沒有現成的專案就先建立一個空的安卓專案。在專案級的build.gradle檔案裡新增這一行:

classpath 'com.apollographql.apollo:gradle-plugin:0.3.2'
複製程式碼

這一行應該放在com.android.tools.之後。現在開啟應用程式的build.gradle檔案,並在上面新增這一行

apply plugin: 'com.apollographql.android'
複製程式碼

這一行應該在com.android.application下面。如果你想在你的Kotlin專案中使用Apollo,請將 Apollo 外掛新增在 Kotlin 外掛之前。有了這兩個依賴,我們就將 Apollo 新增到我們的專案裡了。

程式碼生成(Codegen)

Apollo 接收你的GraphQL請求和schema檔案,並從中生成Java類。讓我們研究一下它是如何工作的。

  • src/main下建立一個與你的java/res資料夾相同級別的資料夾。你可以給這個資料夾取任意名字,我把它命名為graphql

  • 在這個資料夾下新增 schema.json 檔案。Schema.json 是用來描述你的 GraphQL API、所有欄位和輸入引數等資訊的檔案。這裡有一個示例 schema 檔案。

  • 在同一個資料夾裡新增副檔名為 .graphql 的 GraphQL 查詢(query)檔案,這些查詢會被 Apollo codegen 用來生成返回資料的資料結構。這裡有一個示例 GraphQL 檔案。

新增完 schema 檔案和 .graphql 檔案之後,重新build一下專案。Apollo 會解析這些查詢(query)和模式(schema)併為你生成程式碼。當build完成之後,你可以去 app/build/generated/source/apollo 資料夾下檢視生成的檔案。

連線

現在我們已經新增了 Apollo 依賴關係,而且生成了程式碼, 接下來讓我們連起一切,建立我們的第一個 GraphQL 網路請求。

在這個示例應用裡,我們將使用 GitHub 的一個示例 GraphQL API :githunt-api.herokuapp.com/graphql

Apollo使用OkHTTP作為網路客戶端,如果你已經熟悉了OkHttp,你就知道我們可以使用OkHttp 新增任何headers 和 interceptors

新增需要的請求頭資訊

  OkHttpClient okHttpClient = new OkHttpClient.Builder()
      .addInterceptor(logging)
      .build();
複製程式碼

如果你想啟用快取,apollo 支援3級快取,可以通過這個連結瞭解更多關於快取的資訊:github.com/apollograph…。如果你決定使用快取,你還需要新增以下依賴關係。

compile "com.apollographql.apollo:apollo-android-support:0.3.2"
複製程式碼

現在我們有了OkHttp Client和Cache,我們可以建立Apollo client物件了。

apolloClient = ApolloClient.*builder*()
        .serverUrl(*BASE_URL*)
        .okHttpClient(okHttpClient)
        .normalizedCache(normalizedCacheFactory, cacheKeyResolver)
        .build();
複製程式碼

快取的部分是可選的,一旦建立了Apollo client,你所有的網路請求都可以使用同一個 client。

第一個 GraphQL 請求

在我們的示例APP裡面,Apollo 從我們的示例 .graphql 檔案生成FeedQuery 類。我們使用這個類進行網路呼叫,使用我們新建立的apolloClient物件。

建立請求並傳遞所有引數

FeedQuery feedQuery = FeedQuery.*builder*()
        .limit(*FEED_SIZE*)
        .type(FeedType.*HOT*)
        .build();
複製程式碼

Limit 和 Type是我們graphQL 查詢中的動態引數,Apollo自動為這些引數建立setters方法,讓我們能夠從java程式碼裡面傳遞這些引數。

建立 ApolloCall

ApolloCall<FeedQuery.Data> githuntFeedCall = apolloClient
                                             .query(feedQuery);
複製程式碼

Apollo支援普通的回撥RxJava。示例程式裡面有兩個API,一個通過普通回撥來使用,一個是通過RxJava。這篇文章裡面,我們看看回撥方式是如何工作的。

githuntFeedCall.enqueue(new ApolloCall.Callback<FeedQuery.Data>() {
    @Override
    public void onResponse(@Nonnull Response<FeedQuery.Data> response) {
        FeedQuery.Data data = response.data();
    }

    @Override
    public void onFailure(@Nonnull ApolloException e) {

    }
});
複製程式碼

使用普通的回撥方法,你所需要做的就是在呼叫enqueue函式的時候傳入ApolloCall.Callback回撥,類似於Retrofit的風格。

現在你已經成功地在你的安卓應用裡使用了第一個GraphQL API。

GraphQL功能強大,而且可以很好的替代基於REST的API。如果你正在處理複雜的API,而且它支援GraphQL的話,你可以通過切換到GraphQL 來簡化你的應用。

這裡有一個完整的示例程式github.com/apollograph…。但是Apollo的示例APP新增了所有專案級別的依賴關係,而且不能很好的工作。

所以我修改了示例app,並且刪除了所有專案級別的依賴關係,你可以從以下連結找到這個使用Apollo和GraphQL 的完整有效的APP。github.com/pranayairan…

相關文章