轉載請注明:http://www.lxweimin.com/p/135edb8cf588
????最近公司的項目后端選擇使用graphql,既然后端選擇了graphql,那么客戶端也要跟上腳步才行。初接觸apollo,除了官方文檔,網上能找到的資料很少,寫一篇學習過程心得體會,即是對自己學習的總結記錄,也希望能幫到其他朋友。
graphql介紹
????我的理解,傳統的rest形式的api,參數和返回值在設計后便已固定,客戶端只需要按照協議調用。但是對于graphql,參數和返回值都可以自定義,除了用“!”定義的字段,其他字段都是按需添加,api接口都十分靈活。
android客戶端使用apollo
????graphql支持多種語言多種,graphql for client可統稱為apollo,后端包括java,springboot,nodejs等。這里附送github地址: https://github.com/apollographql/apollo-android
1.添加project級別的依賴,目前apollo最新版本為1.0.1
./apollo-demo-project/build.gradle文件添加:
buildscript {
repositories {
google()
#新增
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
#新增
classpath 'com.apollographql.apollo:apollo-gradle-plugin:1.0.1'
}
}
2.添加app級別的依賴
./apollo-demo-project/app/build.gradle文件添加:
- 此處必須添在apply plugin: 'com.android.application'后面添加
apply plugin: 'com.android.application'
#新增
apply plugin: 'com.apollographql.android'
- 添加庫
android {
repositories {
//新增
jcenter()
}
}
- 添加依賴
dependencies {
//新增 阿波羅庫
implementation 'com.apollographql.apollo:apollo-runtime:1.0.1'
}
到此,依賴添加完畢,Sync Project將下載依賴到本地,但是要想真正使用,還必須添加配置文件,包括schema.graphql, schema.json這兩個文件
3.添加配置文件schema.graphql, schema.json
????在工程./apollo-demo-project/app/src/main/目錄下創建目錄名為graphql的目錄,雖然官方說可以隨意命名,但是實踐發現如果命名為其他名稱,框架將讀取不到配置文件,這里就不展開討論了。將schema.grapql文件和schema.json文件添加到此目錄中,build一波。build成功后,./apollo-demo-project/app/build/generated/source/classes目錄下將會出現更具配置文件生成的java類,這些類將在發起請求中使用到,我們后面再將如何發起請求。
- schema.graphql文件
????這個文件的命名,需要保證后綴名為graphql,前綴可以任意命名,這個文件是前后端通用的,可以有多個,只需要保證后綴名正確即可。在實踐中,我發現如果xxx.grapqhl文件在./apollo-demo-project/app/src/main/graphql目錄中,動態生成的文件無法在其他類中被import到,解決方法是在graphql目錄中新建com/graphql/data目錄,將xxx.graphql文件添加到這個目錄中。那么生成的文件將在build/generated/apollo/classes/com/graphql/data/目錄中。如果你們有更好的方法,歡迎討論。
????xxx.graphql文件,請讓后端的同事提供給你,并且前后端要保持一致。如果你暫時沒有,可以到官方demo中找到 *.graphql文件
graphql文件語法介紹
type Book{
id:String
name: String
author:String
}
type Query {
findBookById(id: String):Book
findAllBooks:[Book]
}
說明1:type Book {
........
}
定義了一個實體Book,有三個屬性,id,書名,作者,都是String類型
說明2:
findBookById(id: String):Book
定義一個根據id查詢book的接口,參數為id,返回值為Book
說明3:
findAllBooks:[Book]
定義一個查詢所有書本的接口,沒有參數,返回值為Book數組
graphql文件的配置用法比較多,我這里只介紹了query查詢方法,還有一個大類叫mutation,用于增刪改,不多作介紹了,有空專門寫一篇介紹graphql文件的文章
- schema.json文件
????這個文件名時固定的,不能有任何變化,且必須放在./apollo-demo-project/app/src/main/graphql/schema.json必須由后端同事提供,后端部署成功后,會自動生成schema.json文件。這個文件自己寫大概是不太可能了,經過實踐,哪怕是最近簡單的一個接口,生成的json文件也在20K左右(未格式化的情況下),手寫不太現實。或者先使用官方demo里面的json文件。
????實際使用中,后端以java-springboot為例,schema.json文件默認的訪問地址為
或者可以通過apollo-codegen工具或者apollo工具獲取,當然數據來源依舊來自源于后端服務器
apollo-codegen使用方法
npm install -g apollo-codegen
apollo-codegen introspect-schema http://xxxx:8080/graphql --output ./schema.jsonapollo使用方法
npm install -g apollo
使用方法差不多,語法可能有些差異,下次再寫吧
讓后端小伙伴提供schema.json,就醬:)
提醒:schema.json文件和xxx.graphql文件必須是對應的,否則將無法通過編譯。
3. 發起請求
????Retrofit+okhttp+rxjava框架,在android開發中使用的相當普遍,而apollo將代替Retrofit,其他的不變,上代碼
//apollo本身沒有get方式的請求,同樣支持三級緩存。
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
ApolloClient apolloClient = ApolloClient.builder()
.serverUrl("https://www.baidu.com")
.okHttpClient(okHttpClient)
.build();
apolloClient.query(ListPostsQuery.builder().build()).enqueue(new ApolloCall.Callback<ListPostsQuery.Data>() {
@Override
public void onResponse(@NotNull Response<ListPostsQuery.Data> response) {
//TODO:成功
}
@Override
public void onFailure(@NotNull ApolloException e) {
//TODO:失敗
}
});
apollo框架的使用介紹到這里就結束了,有空再寫一篇文章展開一些細節,歡迎大家留言討論。
參考資料:
- apollo github https://github.com/apollographql/apollo-android
- graphql中文官網 https://graphql.cn/