Apollo 客户端 Kotlin 教程简介

简述

本文介绍了Apollo GraphQL Kotlin Client的概述和使用方法。特别是对以下教程进行了总结。

《Apollo Kotlin教程简介》
请注意,本文是基于教程整理的信息摘要。因此,我们建议您阅读教程。

阿波羅Kotlin是什麼?

Apollo GraphQL Kotlin Client是一个GraphQL客户端。如果API支持GraphQL,您可以灵活地从单个端点获取所需的数据。此外,通过使用配置文件.graphqls,它可以自动生成用于客户端的模型类。因此,您无需进行JSON解析或将数据映射到模型类中,从而提高开发效率。当然,API必须支持GraphQL。

请查阅官方的GitHub存储库以获取更详细信息。

GraphQL 是一种查询语言。

GraphQL是一种Web API设计方法之一。与传统的REST API相比,它具有以下特点。

GraphQLREST API備考データのフェッチに必要なリクエスト数が少なくなる複数のエンドポイントが必要なため、データのフェッチに必要なリクエスト数が増える
「アンダーフェッチがない」って言い方をしたりする必要なデータだけを取得できるため、レスポンスサイズが小さくなる一度に大量のデータを取得することができるため、レスポンスサイズが大きくなる可能性がある「オーバーフェッチがない」って言い方をしたりする単一エンドポイントで複数のデータを要求できるエンドポイントごとに異なるURLを使用する必要があり、複数のリクエストが必要になる
APIから必要なデータを柔軟に取得できるAPIから取得できるデータは事前に定義されており、必要なデータをすべて取得する必要がある

サーバー側で定義されたスキーマに基づいて動的にデータを要求できるAPIエンドポイントが変更された場合、コード内のエンドポイント情報も変更する必要がある

简言之,GraphQL的设计目标是提供灵活、高效、易用的API。

数据传输的形象

当您定义API的请求和响应格式后,将会返回Json格式的数据到指定文件中。

// イメージ
{
  hero {
    name
  }
}

使用以下方式获取JSON响应

{
  "hero": {
      "name": "Luke Skywalker"
  }
}

添加字段后,可以仅获取所需的信息。

{
  hero {
    name
    height
  }
}

// json
{
  "hero": {
      "name": "Luke Skywalker",
      "height": 1.72,
  }
}

GraphQL客户端会从这里继续创建Model类。
在指定的文件(graphqls文件)中定义模式,并使用GraphQL定义执行查询。

// hoge.graphqls
type SampleQuery {
    hero: Hero
}

type Hero {
    name: String!
    height: Int!
}

schema {
    query: SampleQuery
}

// hoge.graphql
query getHero {
    hero {
        name
    }
}

请提供更多的上下文或原始文本以便进行翻译。

//
// AUTO-GENERATED FILE. DO NOT MODIFY.
//
// This class was automatically generated by Apollo GraphQL version '3.7.5'.
//
package com.example.rocketreserver

import ...

public class GetHeroQuery() : Query<GetHeroQuery.Data> {
  public override fun equals(other: Any?): Boolean = other != null && other::class == this::class

  public override fun hashCode(): Int = this::class.hashCode()

  public override fun id(): String = OPERATION_ID

  public override fun document(): String = OPERATION_DOCUMENT

  public override fun name(): String = OPERATION_NAME

  public override fun serializeVariables(writer: JsonWriter,
      customScalarAdapters: CustomScalarAdapters): Unit {
    // This operation doesn't have any variable
  }

  public override fun adapter(): Adapter<Data> = GetHeroQuery_ResponseAdapter.Data.obj()

  public override fun rootField(): CompiledField = CompiledField.Builder(
    name = "data",
    type = SampleQuery.type
  )
  .selections(selections = GetHeroQuerySelections.__root)
  .build()

  @ApolloAdaptableWith(GetHeroQuery_ResponseAdapter.Data::class)
  public data class Data( // Model データ
    public val hero: Hero?,
  ) : Query.Data

  public data class Hero( // Model データ
    public val name: String,
  )

  public companion object {
    public const val OPERATION_ID: String =
        "b15cc8a0721be79e5311944346bb73770d1c84d0a0cac560e2b69c29cb993e7b"

    /**
     * The minimized GraphQL document being sent to the server to save a few bytes.
     * The un-minimized version is:
     *
     * query getHero {
     *   hero {
     *     name
     *   }
     * }
     */
    public val OPERATION_DOCUMENT: String
      get() = "query getHero { hero { name } }"

    public const val OPERATION_NAME: String = "getHero"
  }
}

通过 GetHeroQuery.Data 这个Model类可以获取到Hero。

GraphQL术语

整理一下教程中出现的术语。

模式定义

Objects
GraphQLスキーマに定義するオブジェクトのタイプです。クライアントがフィールドを指定するために使用されます。

Scalars
GraphQLに組み込まれているスカラータイプ。Int、String、Float、Boolean、IDが含まれます。カスタムスカラーを定義することもできます。

Enums
GraphQLスキーマに定義する列挙型です。列挙型は、GraphQLスキーマに対して固定された値を持つフィールドを作成するために使用されます。

执行查询

Query
クライアントがデータを取得するために使用するメソッドです。フィールドの一覧を指定して、返されるデータの構造を定義します。 (RestでいうGet

Mutation
クライアントがデータを変更するために使用するメソッドです。クライアントが送信する変更を指定して、返されるデータの構造を定義します。 (RestでいうPostやPatch

Subscription
クライアントがデータの変更を受け取るために使用するメソッドです。リアルタイムで更新されるデータを取得するために使用されます。 (WebSockts

有关模式定义的特殊术语

    • Directives

 

    スキーマの実行方法に影響を与える指令です。例えば、特定のフィールドを省略したり、フィールドを変形したり、特定のスキーマのフィールドのアクセスを制限することができます。

样本实施

我会啰啰嗦嗦地写出必要的事情。

首先是Gradle。

plugin {
    id("com.android.application")
    // ...
    id("com.apollographql.apollo3").version("anyversion")
}

apollo {
    service("service") {
        packageName.set("com.example.rocketreserver") // package名を指定する
    }
}

dependencies{
....
  implementation("com.apollographql.apollo3:apollo-runtime:anyversion")
}

将上述的设置文件hoge.graphqls、hoge.graphql(示例)存储在以下文件夹中。
为了指示其位置,上述中指定了包名。
{module}/src/main/graphql

客户端类的写法与OkHttp相同。

val apolloClient = ApolloClient.Builder()
    .serverUrl("https://apollo-fullstack-tutorial.herokuapp.com/graphql")
    .webSocketServerUrl("wss://apollo-fullstack-tutorial.herokuapp.com/graphql")
    .okHttpClient(
        OkHttpClient.Builder()
            .addInterceptor(AuthorizationInterceptor())
            .build()
    )
    .webSocketReopenWhen { throwable, attempt ->
        Log.d("Apollo", "WebSocket got disconnected, reopening after a delay", throwable)
        delay(attempt * 1000)
        true
    }

    .build()

class AuthorizationInterceptor() : Interceptor ... 

代码

称呼

    Queryリクエスト
response = apolloClient.query(LaunchListQuery(Optional.present(cursor))).execute()

LaunchListQuer是一个用于执行graphql查询的类。
Optional.present(cursor)是在请求时设置的参数。

响应类型 -> ApolloResponse?

    Mutationリクエスト
apolloClient.mutation(LoginMutation(email = email)).execute()

LoginMutation是一个用于执行Mutation的类,由graphql创建。
响应类型 -> ApolloResponse

    Subscription
val tripBookedFlow = remember { apolloClient.subscription(TripsBookedSubscription()).toFlow() }
    val tripBookedResponse: ApolloResponse<TripsBookedSubscription.Data>? by tripBookedFlow.collectAsState(initial = null)
    LaunchedEffect(tripBookedResponse) {
        if (tripBookedResponse == null) return@LaunchedEffect
        val message = when (tripBookedResponse!!.data?.tripsBooked) {
            null -> "Subscription error"
            -1 -> "Trip cancelled"
            else -> "Trip booked! ?"
        }
        // TODO use the message
    }

由于订阅,因此在Flow中监视更改是常见的。
TripsBookedSubscription是用于执行来自graphql的Mutation的类。

结束。

SQLDelight能从配置文件中创建Model类,所以对于多平台环境来说,这似乎是理所应当的。
由于我的工作性质,我常常待在移动设备中,但发现外面的世界也很有趣呢。

bannerAds