使用自定义的HTTP客户端
默认情况下,Apollo Kotlin为不同的平台/语言使用以下HTTP客户端:
平台 | HTTP客户端 |
---|---|
Android/JVM | OkHttp |
JavaScript/Wasm | fetch() / Node Fetch 用于HTTP,Ktor 用于WebSocket |
iOS/MacOS | NSURLSession |
实现自己的HTTP引擎
您可以通过创建一个自定义类来实现Apollo Kotlin中的HttpEngine
接口来使用不同的HTTP客户端。
HttpEngine接口定义了两个函数:execute和close。以下是一个包含一些辅助方法示例实现:HttpEngine接口。这里是一个包含辅助方法的示例实现:
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 close() {// Dispose any resources here}}
此示例使用一个异步的wrappedClient
,它在一个单独的线程中运行网络请求。注意,由于HttpEngine.execute
自身是从后台线程中调用的,你可以在execute()
中进行阻塞。
使用您的 HttpEngine
在您创建HttpEngine
实现后,您可以使用以下方式将其注册到您的ApolloClient
实例中ApolloClient.Builder.httpEngine
进行注册:
// Use your HttpEngineval client = ApolloClient.Builder().serverUrl(serverUrl = "https://example.com/graphql").httpEngine(httpEngine = MyHttpEngine(wrappedClient)).build()
此配置下,Apollo Kotlin会使用GraphQL操作请求发送到MyHttpEngine
。
Ktor引擎
一个基于Ktor的HttpEngine
实现可在apollographql/apollo-kotlin-ktor-support找到。
其他HTTP定制
除了实现HttpEngine
外,Apollo Kotlin还支持其他自定义HTTP行为的方法: