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相比,它具有以下特点。
「アンダーフェッチがない」って言い方をしたりする必要なデータだけを取得できるため、レスポンスサイズが小さくなる一度に大量のデータを取得することができるため、レスポンスサイズが大きくなる可能性がある「オーバーフェッチがない」って言い方をしたりする単一エンドポイントで複数のデータを要求できるエンドポイントごとに異なる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类,所以对于多平台环境来说,这似乎是理所应当的。
由于我的工作性质,我常常待在移动设备中,但发现外面的世界也很有趣呢。