使用自定义 HTTP 客户端
默认情况下,Apollo Kotlin针对不同的平台/语言使用以下 HTTP 客户端:
平台 | HTTP 客户端 |
---|---|
Android | OkHttp |
JavaScript | Ktor |
iOS/MacOS | NSURLSesssion |
您可以通过创建一个实现 Apollo Kotlin 的 HttpEngine
接口的类来使用不同的 HTTP 客户端。
HttpEngine
接口
HttpEngine 接口定义了两个函数: execute 和 dispose。。以下是一个示例实现,还包括一些辅助方法:execute
和 dispose
。
class MyHttpEngine(val wrappedClient: MyClient) : HttpEngine {/*** Helper function to map the Apollo requests to MyClient requests*/private fun HttpMethod.toMyClientRequest(): MyClientRequest {...}/*** And the other way around*/private fun MyClientResponse.toApolloResponse(): HttpResponse {...}override suspend fun execute(request: HttpRequest) = suspendCancellableCoroutine { continuation ->val call = wrappedClient.newCall(request.toMyClientRequest())continuation.invokeOnCancellation {// If the coroutine is cancelled, also cancel the HTTP callcall.cancel()}wrappedClient.enqueue(call,success = { myResponse ->// Success! report the responsecontinuation.resume(myResponse.toApolloResponse())},error = { throwable ->// Error. Wrap in an ApolloException and report the errorcontinuation.resumeWithException(ApolloNetworkException(throwable))})}override fun dispose() {// Dispose any resources here}}
此示例使用异步 wrappedClient
在单独的线程中运行网络请求。请注意,由于 HttpEngine
itself 是从后台线程中调用的,因此您可以在 execute
中安全地阻塞。
使用您的 HttpEngine
创建您的 HttpEngine
实现后,您可以使用 ApolloClient
实例,使用 ApolloClient.Builder.httpEngine
注册:
// Use your HttpEngineval client = ApolloClient.Builder().serverUrl(serverUrl = "https://com.example/graphql").httpEngine(httpEngine = MyHttpEngine(wrappedClient)).build()
使用此配置,Apollo Kotlin 会发送所有的 GraphQL 操作请求,并使用 MyHttpEngine
。
其他 HTTP 定制
除了实现 HttpEngine
,Apollo Kotlin 还支持其他方法来自定义 HTTP 行为: