graphql初识

前言

本文从graphql查询、修改语句到Android客户端如何引用讲解。不涉及服务端哦~

预览

先看一下graphql的大致样式,下图是一个查询语句,可以看到graphql的查询语句和最终的查询结果json很相似。


左边是graphQL查询,中间是结果,右边是restful查询

服务端启动项目

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


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

页面讲解

  1. 点击右边的docs可以看到如下的页面。



    我们可以看到第一栏有查询、修改、订阅的入口,查询入口咱们可以看到这里可以查询hero、查询reviews等,修改是createReview,即新增一个review,订阅是监听review被新增的这样一个事件。第二栏,是reviews():[Review]的详情,第二栏上边我们可以看到这里要求一个参数是episode,下面是review这个type的具体有哪些字段,像是类名和类的成员。第三栏可以看到每一个字段的注释。可以自己点击看看哦。

  2. 点击schema按钮,咱们可以看到如下的页面
    schema

    这里可以一下子看到可以做哪些请求以及有哪些类型,像是docs的简略版。这里有interface(接口,公共字段)、input(输入类型)、type(类型)、enum(枚举),,因为这些都是后端生成的,所以不做讲解,具体的可以直接看官方文档。
    这里我们只需要知道!代表一定不能为空,例如查询reviews:
    episode后有一个!号,这代表一定要传episode这个参数。不能为空。[Review] 代表返回的是一个review列表。
    接下来咱们就开始学增删改查语句啦~

语法

讲解语法前,先学一个快捷键,输入1就会自动提示哦
query查询语句:


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

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

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

订阅事件为subscription,这里当监听到review被添加,就会返回结果

客户端调用

先提示一下,这里的代码里有viewModelScope,这是协程的调用,如果没接触到协程的,知道它是异步调用就好。

  1. 配置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")
}
  1. 在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()
  1. 查询语句
    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
            }
        }
  1. 修改语句
   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
            }
        }
  1. 订阅语句
  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

你可能感兴趣的:(graphql初识)