クライアントエンジン
Ktor HTTPクライアントはマルチプラットフォームで、JVM、 Android、JavaScript (WebAssemblyを含む)、およびNativeターゲットで動作します。各プラットフォームでは、ネットワークリクエストを処理するために特定のエンジンが必要です。 例えば、JVMアプリケーションにはApache
またはJetty
、AndroidにはOkHttp
またはAndroid
、Kotlin/NativeをターゲットとするデスクトップアプリケーションにはCurl
を使用できます。すべてのエンジンは機能と構成が若干異なるため、プラットフォームとユースケースのニーズに最適なものを選択できます。
サポートされるプラットフォーム
以下の表は、各エンジンがサポートするプラットフォームを示しています。
Engine | Platforms |
---|---|
Apache5 | JVM |
Java | JVM |
Jetty | JVM |
Android | JVM, Android |
OkHttp | JVM, Android |
Darwin | Native |
WinHttp | Native |
Curl | Native |
CIO | JVM, Android, Native, JavaScript, WasmJs |
Js | JavaScript |
サポートされるAndroid/Javaバージョン
JVMまたはJVMとAndroidの両方をターゲットとするクライアントエンジンは、以下のAndroid/Javaバージョンをサポートします。
Engine | Android version | Java version |
---|---|---|
Apache5 | 8+ | |
Java | 11+ | |
Jetty | 11+ | |
CIO | 7.0+ * | 8+ |
Android | 1.x+ | 8+ |
OkHttp | 5.0+ | 8+ |
* 古いAndroidバージョンでCIOエンジンを使用するには、Java 8 API desugaringを有効にする必要があります。
エンジンの依存関係を追加する
`ktor-client-core`アーティファクトに加えて、Ktorクライアントは特定のエンジンの依存関係を必要とします。サポートされている各プラットフォームには、対応するセクションで説明されている利用可能なエンジンのセットがあります。
Ktorは、
-jvm
や-js
などのサフィックスを持つプラットフォーム固有のアーティファクト(例:ktor-client-cio-jvm
)を提供します。依存関係の解決はビルドツールによって異なります。Gradleは指定されたプラットフォームに適したアーティファクトを解決しますが、Mavenはこの機能をサポートしていません。これは、Mavenの場合、プラットフォームサフィックスを手動で指定する必要があることを意味します。
エンジンを指定する
特定のエンジンを使用するには、エンジンクラスを `HttpClient`コンストラクターに渡します。次の例は、`CIO`エンジンでクライアントを作成します。
import io.ktor.client.*
import io.ktor.client.engine.cio.*
val client = HttpClient(CIO)
デフォルトエンジン
エンジン引数を省略した場合、クライアントはビルドスクリプト内の依存関係に基づいてエンジンを自動的に選択します。
import io.ktor.client.*
val client = HttpClient()
これはマルチプラットフォームプロジェクトで特に便利です。例えば、AndroidとiOSの両方をターゲットとするプロジェクトの場合、`androidMain`ソースセットにAndroidの依存関係を、`iosMain`ソースセットにDarwinの依存関係を追加できます。`HttpClient`の作成時に、適切なエンジンが実行時に選択されます。
エンジンを構成する
エンジンを構成するには、`engine {}`関数を使用します。すべてのエンジンは、 `HttpClientEngineConfig`からの共通オプションを使用して構成できます。
HttpClient() {
engine {
// this: HttpClientEngineConfig
threadsCount = 4
pipelining = true
}
}
次のセクションでは、異なるプラットフォームで特定のエンジンを構成する方法について説明します。
JVM
JVMターゲットは、`Apache5`、`Java`、および `Jetty`エンジンをサポートします。
Apache5
`Apache5`エンジンはHTTP/1.1とHTTP/2の両方をサポートし、HTTP/2はデフォルトで有効になっています。 これは新規プロジェクトに推奨されるApacheベースのエンジンです。
古い`Apache`エンジンはApache HttpClient 4に依存しており、これは非推奨です。 後方互換性のためだけに維持されています。すべての新規プロジェクトでは`Apache5`を使用してください。
`ktor-client-apache5`の依存関係を追加します。
KotlinGroovyXML`Apache5`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.apache5.* val client = HttpClient(Apache5)
`engine {}`ブロックを使用して、`Apache5EngineConfig`からプロパティにアクセスして設定します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.apache5.* import org.apache.hc.core5.http.* val client = HttpClient(Apache5) { engine { // this: Apache5EngineConfig followRedirects = true socketTimeout = 10_000 connectTimeout = 10_000 connectionRequestTimeout = 20_000 customizeClient { // this: HttpAsyncClientBuilder setProxy(HttpHost("127.0.0.1", 8080)) // ... } customizeRequest { // this: RequestConfig.Builder } } }
Java
`Java`エンジンは、Java 11で導入されたJava HTTPクライアントを使用します。これを使用するには、以下の手順に従います。
`ktor-client-java`の依存関係を追加します。
KotlinGroovyXMLJavaクラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.java.* val client = HttpClient(Java)
エンジンを構成するには、`engine {}`ブロックで `JavaHttpConfig`からプロパティを設定します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.* import io.ktor.client.engine.java.* val client = HttpClient(Java) { engine { // this: JavaHttpConfig threadsCount = 8 pipelining = true proxy = ProxyBuilder.http("http://proxy-server.com/") protocolVersion = java.net.http.HttpClient.Version.HTTP_2 } }
Jetty
`Jetty`エンジンはHTTP/2のみをサポートし、以下の方法で構成できます。
`ktor-client-jetty-jakarta`の依存関係を追加します。
KotlinGroovyXML`Jetty`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.jetty.jakarta.* val client = HttpClient(Jetty)
エンジンを構成するには、`engine {}`ブロックで `JettyEngineConfig`からプロパティを設定します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.jetty.jakarta.* import org.eclipse.jetty.util.ssl.SslContextFactory val client = HttpClient(Jetty) { engine { // this: JettyEngineConfig sslContextFactory = SslContextFactory.Client() clientCacheSize = 12 } }
JVMとAndroid
このセクションでは、JVM/Androidで利用可能なエンジンとその構成について見ていきます。
Android
`Android`エンジンはAndroidをターゲットとしており、以下の方法で構成できます。
`ktor-client-android`の依存関係を追加します。
KotlinGroovyXML`Android`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.android.* val client = HttpClient(Android)
エンジンを構成するには、`engine {}`ブロックで `AndroidEngineConfig`からプロパティを設定します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.android.* import java.net.Proxy import java.net.InetSocketAddress val client = HttpClient(Android) { engine { // this: AndroidEngineConfig connectTimeout = 100_000 socketTimeout = 100_000 proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("localhost", 8080)) } }
OkHttp
`OkHttp`エンジンはOkHttpに基づいており、以下の方法で構成できます。
`ktor-client-okhttp`の依存関係を追加します。
KotlinGroovyXML`OkHttp`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.okhttp.* val client = HttpClient(OkHttp)
エンジンを構成するには、`engine {}`ブロックで `OkHttpConfig`からプロパティを設定します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.okhttp.* val client = HttpClient(OkHttp) { engine { // this: OkHttpConfig config { // this: OkHttpClient.Builder followRedirects(true) // ... } addInterceptor(interceptor) addNetworkInterceptor(interceptor) preconfigured = okHttpClientInstance } }
Native
Ktorは、Kotlin/Nativeターゲット向けに、`Darwin`、`WinHttp`、および`Curl`エンジンを提供しています。
Kotlin/NativeプロジェクトでKtorを使用するには、新しいメモリマネージャーが必要です。これはKotlin 1.7.20以降でデフォルトで有効になっています。
Darwin
`Darwin`エンジンは、macOS、iOS、tvOS、watchOSなどのDarwinベースのオペレーティングシステムをターゲットとし、内部で`NSURLSession`を使用します。`Darwin`エンジンを使用するには、以下の手順に従います。
`ktor-client-darwin`の依存関係を追加します。
KotlinGroovyXML`Darwin`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.darwin.* val client = HttpClient(Darwin)
`engine {}`ブロックで、 `DarwinClientEngineConfig`を使用してエンジンを構成します。例えば、`configureRequest`でリクエストを、または`configureSession`でセッションをカスタマイズできます。
kotlinval client = HttpClient(Darwin) { engine { configureRequest { setAllowsCellularAccess(true) } } }
完全な例はclient-engine-darwinで見つけることができます。
WinHttp
`WinHttp`エンジンはWindowsベースのオペレーティングシステムをターゲットとしています。 `WinHttp`エンジンを使用するには、以下の手順に従います。
`ktor-client-winhttp`の依存関係を追加します。
KotlinGroovyXML`WinHttp`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.winhttp.* val client = HttpClient(WinHttp)
`engine {}`ブロックで、 `WinHttpClientEngineConfig`を使用してエンジンを構成します。例えば、`protocolVersion`プロパティを使用してHTTPバージョンを変更できます。
kotlinval client = HttpClient(WinHttp) { engine { protocolVersion = HttpProtocolVersion.HTTP_1_1 } }
完全な例はclient-engine-winhttpで見つけることができます。
Curl
デスクトッププラットフォーム向けに、Ktorは`Curl`エンジンを提供しています。このエンジンは`linuxX64`、`linuxArm64`、`macosX64`、`macosArm64`、および`mingwX64`でサポートされています。`Curl`エンジンを使用するには、以下の手順に従います。
libcurlライブラリをインストールします。
Linuxでは、libcurlの`gnutls`バージョンをインストールする必要があります。 Ubuntuにこのバージョンをインストールするには、以下を実行します。
bashsudo apt-get install libcurl4-gnutls-dev
Windowsでは、MinGW/MSYS2の`curl`バイナリを検討すると良いでしょう。
`ktor-client-curl`の依存関係を追加します。
KotlinGroovyXML`Curl`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.curl.* val client = HttpClient(Curl)
`engine {}`ブロックで`CurlClientEngineConfig`を使用してエンジンを構成します。 例えば、テスト目的でSSL検証を無効にする方法を以下に示します。
kotlinval client = HttpClient(Curl) { engine { sslVerify = false } }
完全な例はclient-engine-curlで見つけることができます。
JVM、Android、Native、JS、およびWasmJs
CIO
CIOエンジンは、JVM、Android、Native、JavaScript、およびWebAssembly JavaScript (WasmJs) プラットフォームで利用できる完全に非同期のコルーチンベースのエンジンです。現在のところ、HTTP/1.xのみをサポートしています。これを使用するには、以下の手順に従います。
`ktor-client-cio`の依存関係を追加します。
KotlinGroovyXML`CIO`クラスを `HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.cio.* val client = HttpClient(CIO)
`engine {}`ブロックで、 `CIOEngineConfig`を使用してエンジンを構成します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.network.tls.* val client = HttpClient(CIO) { engine { // this: CIOEngineConfig maxConnectionsCount = 1000 endpoint { // this: EndpointConfig maxConnectionsPerRoute = 100 pipelineMaxSize = 20 keepAliveTime = 5000 connectTimeout = 5000 connectAttempts = 5 } https { // this: TLSConfigBuilder serverName = "api.ktor.io" cipherSuites = CIOCipherSuites.SupportedSuites trustManager = myCustomTrustManager random = mySecureRandom addKeyStore(myKeyStore, myKeyStorePassword) } } }
JavaScript
`Js`エンジンはJavaScriptプロジェクトで使用できます。このエンジンは、ブラウザアプリケーションにはfetch APIを、Node.jsには`node-fetch`を使用します。これを使用するには、以下の手順に従います。
`ktor-client-js`の依存関係を追加します。
KotlinGroovyXML`Js`クラスを`HttpClient`コンストラクターの引数として渡します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.js.* val client = HttpClient(Js)
`JsClient()`関数を呼び出して、`Js`エンジンのシングルトンを取得することもできます。
kotlinimport io.ktor.client.engine.js.* val client = JsClient()
完全な例はclient-engine-jsで見つけることができます。
制限事項
HTTP/2とWebSockets
すべてのエンジンがHTTP/2プロトコルをサポートしているわけではありません。エンジンがHTTP/2をサポートしている場合、エンジンの構成で有効にできます。例えば、Javaエンジンを使用する場合などです。
以下の表は、特定のエンジンがHTTP/2とWebSocketsをサポートしているかどうかを示しています。
Engine | HTTP/2 | WebSockets |
---|---|---|
Apache5 | ✅️ | ✖️ |
Java | ✅ | ✅️ |
Jetty | ✅ | ✖️ |
CIO | ✖️ | ✅ |
Android | ✖️ | ✖️ |
OkHttp | ✅ | ✅ |
Js | ✅ | ✅ |
Darwin | ✅ | ✅ |
WinHttp | ✅ | ✅ |
Curl | ✅ | ✅ |
セキュリティ
SSLはエンジンごとに構成する必要があります。各エンジンは独自のSSL構成オプションを提供します。
プロキシのサポート
一部のエンジンはプロキシをサポートしていません。完全なリストについては、プロキシのドキュメントを参照してください。
ロギング
Loggingプラグインは、ターゲットプラットフォームに応じて異なるロガータイプを提供します。
タイムアウト
HttpTimeoutプラグインには、特定のエンジンに対するいくつかの制限があります。完全なリストについては、タイムアウトの制限を参照してください。
例: マルチプラットフォームモバイルプロジェクトでエンジンを構成する方法
マルチプラットフォームプロジェクトを構築する際、各ターゲットプラットフォームのエンジンを選択および構成するために、expect/actual宣言を使用できます。これにより、ほとんどのクライアント構成を共通コードで共有しながら、プラットフォームコードでエンジン固有のオプションを適用できます。 クロスプラットフォームモバイルアプリケーションの作成チュートリアルで作成したプロジェクトを使用して、これを実現する方法を示します。
shared/src/commonMain/kotlin/com/example/kmmktor/Platform.ktファイルを開き、構成ブロックを受け取り`HttpClient`を返すトップレベルの`httpClient()`関数を追加します。
kotlinexpect fun httpClient(config: HttpClientConfig<*>.() -> Unit = {}): HttpClient
shared/src/androidMain/kotlin/com/example/kmmktor/Platform.ktを開き、Androidモジュール用の`httpClient()`関数のactual宣言を追加します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.okhttp.* import java.util.concurrent.TimeUnit actual fun httpClient(config: HttpClientConfig<*>.() -> Unit) = HttpClient(OkHttp) { config(this) engine { config { retryOnConnectionFailure(true) connectTimeout(0, TimeUnit.SECONDS) } } }
この例は`OkHttp`エンジンの構成方法を示していますが、Androidでサポートされている他のエンジンも使用できます。
shared/src/iosMain/kotlin/com/example/kmmktor/Platform.ktを開き、iOSモジュール用の`httpClient()`関数のactual宣言を追加します。
kotlinimport io.ktor.client.* import io.ktor.client.engine.darwin.* actual fun httpClient(config: HttpClientConfig<*>.() -> Unit) = HttpClient(Darwin) { config(this) engine { configureRequest { setAllowsCellularAccess(true) } } }
これで、どのエンジンが使用されるかを気にすることなく、共通コードで`httpClient()`を呼び出すことができます。
共通コードでクライアントを使用するには、shared/src/commonMain/kotlin/com/example/kmmktor/Greeting.ktを開き、`HttpClient()`コンストラクターを`httpClient()`関数呼び出しに置き換えます。
kotlinprivate val client = httpClient()