JVM (Apollo Kotlin)
Apollo Kotlinを使ってDelivery Trackerを使う例です。
Step 1~4 の初期設定が完了すると、以下のようなAPIを簡単に使用することができます。
demo.kt
val response = apolloClient.query(
GetTrackLastEventQuery(
carrierId = "kr.cjlogistics",
trackingNumber = "1234567890",
)
).execute()
val notFoundError = response.findDeliveryTrackerError(code="NOT_FOUND")
if (notFoundError != null) {
println("NotFound : ${notFoundError.message}")
} else {
println(response.data?.track?.lastEvent?.status?.code)
}
注意事項
下記のコードは依存性を最小化するため、コードが長いです。 使用しているHTTP ClientとJSON Parserライブラリを使用すると、コードを簡素化することができます。
ステップ1. プロジェクト設定
ステップ1.1. プラグ インの適用
プロジェクトの build.gradle.kts
ファイルの plugins
にApollo Gradle Plugin(com.apollographql.apollo3
)を追加します。
build.gradle.kts
plugins {
// ...
id("com.apollographql.apollo3") version "3.8.2"
}
Apollo Pluginにはプロジェクトをビルドする時、クエリからモデルを生成するコンパイラが含まれています。
ステップ1.2. Apollo Gradleプラグインの設定
Apollo Plugin を設定し、Codegen になる位置などを指定します。 プロジェクトの build.gradle.kts
ファイルに下記の内容を追加します。
build.gradle.kts
import java.net.URL
import java.util.Base64
import java.io.IOException
// ...
apollo {
service("DeliveryTracker") {
packageName.set("com.demoproject.deliverytracker.api")
schemaFile.set(File("src/main/graphql/schema.graphqls"))
introspection {
endpointUrl.set("https://apis.tracker.delivery/graphql")
headers.put("Authorization", providers.provider {
var accessToken = providers.gradleProperty("deliveryTracker.introspection.accessToken").orNull
if (accessToken != null) {
return@provider "Bearer $accessToken"
}
val clientId = providers.gradleProperty("deliveryTracker.introspection.clientId").orNull
val clientSecret = providers.gradleProperty("deliveryTracker.introspection.clientSecret").orNull
if (clientId == null || clientSecret == null) {
throw InvalidUserDataException("プロパティ 'deliveryTracker.introspection.accessToken'プロパティが存在するか、'deliveryTracker.introspection.clientId'と'deliveryTracker.introspection.clientSecret'プロパティの両方が存在する必要があります。")
}
val connection = URL("https://auth.tracker.delivery/oauth2/token").openConnection() as java.net.HttpURLConnection
connection.requestMethod = "POST"
connection.doOutput = true
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
connection.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString("$clientId:$clientSecret".toByteArray()))
val body = "grant_type=client_credentials".toByteArray()
connection.setRequestProperty("Content-Length", body.size.toString())
connection.outputStream.use { stream ->
stream.write(body, 0, body.size)
}
if (connection.responseCode >= 400) {
val response = connection.errorStream.bufferedReader().use { it.readText() }
throw IOException("Failed to authenticate with Delivery Tracker. Server responded with error: $response")
}
val response = connection.inputStream.bufferedReader().use { it.readText() }
val matchResult = """"access_token"\s*:\s*"(.+?)"""".toRegex().find(response)
accessToken = matchResult?.groups?.get(1)?.value
if (accessToken == null) {
throw IOException("Authentication failed: Unable to parse the access token from the response. Response received: $response")
}
"Bearer $accessToken"
})
}
}
}
ステップ1.3. 依存関係の追加
build.gradle.kts
dependencies {
// ...
implementation("com.apollographql.apollo3:apollo-runtime:3.8.2")
}
ステップ1.4. グラドルプロパティの設定
Schema Download のためには認証情報の設定が必要です。
プロジェクトディレクトリのgradle.properties
などを修正して必要なGradle Propertiesを注入する必要があります。
Gradle Propertiesの設定方法についてもっと詳しく知りたい場合はこちらを参照してください。
gradle.properties
# ...
deliveryTracker.introspection.introspection.clientId=[YOUR_CLIENT_ID]
deliveryTracker.introspection.clientSecret=[YOUR_CLIENT_SECRET]...
clientId, clientSecret につ いて知りたい場合はこちらを参照してください。
ステップ1.4. Reload Gradleプロジェクト
最後に変更内容を反映するためGradle build scriptをreloadします。
この時、schemaファイルがなくてエラーが発生した場合、一時的なschemaファイルを生成します。
echo "type Query { dummy: Boolean }" > src/main/graphql/schema.graphqls