前言
本文从graphql查询、修改语句到Android客户端如何引用讲解。不涉及服务端哦~
预览
先看一下graphql的大致样式,下图是一个查询语句,可以看到graphql的查询语句和最终的查询结果json很相似。

左边是graphQL查询,中间是结果,右边是restful查询
服务端启动项目
这里使用starWars 项目为服务端,给我们提供数据,运行项目后,可以看到一个地址,这个地址就是唯一的url啦,增删改查只需要改变graphQL语句即可,完全不需要像restful请求一样有多个api。

接下来咱们在浏览器里输入这个http://localhost:8080/graphql地址,即可看到如下的页面。当然,如果是部署到服务器了,这里输入的应该是部署的地址哦,咱们是本地启动的,所以是localhost这个地址。

页面注解
页面讲解
-
点击右边的docs可以看到如下的页面。
我们可以看到第一栏有查询、修改、订阅的入口,查询入口咱们可以看到这里可以查询hero、查询reviews等,修改是createReview,即新增一个review,订阅是监听review被新增的这样一个事件。第二栏,是reviews():[Review]的详情,第二栏上边我们可以看到这里要求一个参数是episode,下面是review这个type的具体有哪些字段,像是类名和类的成员。第三栏可以看到每一个字段的注释。可以自己点击看看哦。
- 点击schema按钮,咱们可以看到如下的页面
schema
这里可以一下子看到可以做哪些请求以及有哪些类型,像是docs的简略版。这里有interface(接口,公共字段)、input(输入类型)、type(类型)、enum(枚举),,因为这些都是后端生成的,所以不做讲解,具体的可以直接看官方文档。
这里我们只需要知道!代表一定不能为空,例如查询reviews:episode后有一个!号,这代表一定要传episode这个参数。不能为空。[Review] 代表返回的是一个review列表。
接下来咱们就开始学增删改查语句啦~
语法
讲解语法前,先学一个快捷键,输入1就会自动提示哦
query查询语句:

这是一个平平无奇的查询语句

这是一个需要参数的查询语句,注意!号哦

增删改查为mutation,这里为创建一个review

订阅事件为subscription,这里当监听到review被添加,就会返回结果
客户端调用
先提示一下,这里的代码里有viewModelScope,这是协程的调用,如果没接触到协程的,知道它是异步调用就好。
- 配置build.gradle
plugins {
id("com.apollographql.apollo3").version("3.3.0")
}
dependencies {
implementation("com.apollographql.apollo3:apollo-runtime:3.3.0")
}
apollo {
packageName.set("com.example")
}
- 在src/main下放入文件
之后一定要重新编译一下文件,才能生成对应的代码
3.初始化qpolloclient
val okHttpClient = OkHttpClient.Builder()
.build()
val apolloClient = ApolloClient.Builder()
.serverUrl("http://10.0.32.3:8080/graphql")
//订阅事件时需要
.webSocketServerUrl("ws://10.0.32.3:8080/websocket")
//可以自定义也可以不要
.okHttpClient(okHttpClient)
.build()
- 查询语句
viewModelScope.launch {
try {
val resr = apolloClient.query(HeroQuery()).execute()
_text.value = "name:${resr.data?.hero?.name}"
} catch (e: ApolloException) {
_text.value = e.message
}
}
viewModelScope.launch {
try {
val execute = apolloClient.query(ReviewQuery(Episode.JEDI)).execute()
_text.value = execute.data?.reviews?.map { it?.commentary }?.joinToString(",")
} catch (e: ApolloException) {
_text.value = e.message
}
}
- 修改语句
viewModelScope.launch {
delay(500L)
try {
val resr = apolloClient.mutation(CreateReviewMutation()).execute()
_text.value = "新增:${resr.data?.createReview?.stars?.toString()}"
} catch (e: ApolloException) {
_text.value = e.message
}
}
- 订阅语句
viewModelScope.launch {
try {
apolloClient.subscription(AddedReviewSubscription()).toFlow()
.retryWhen { _, a ->
delay(a * 100)
true
}
.collect {
_text.value = "监听到事件:${it.data?.reviewAdded?.commentary} "
}
} catch (e: ApolloException) {
_text.value = e.message
}
}
后记
这里,万事开头难,开头已经完结了, 后续更深的爬楼梯知识可以去官网看哦
参考网址
英文网:https://graphql.org/
中文网:https://graphql.cn/learn/schema/#type-system
客户端使用的三方库 https://github.com/apollographql/apollo-kotlin



