如果你是一個移動應用開發人員,你一定明白更快的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…