Ktor: とは何か、非同期HTTPクライアントの特徴

著者: IT Sectr 公開日: 2026-03-07 読了時間: 8 分

Ktorは、JetBrainsがサーバーおよびクライアント開発用の同名フレームワークの一部として開発した、Kotlin向けの非同期HTTPクライアントです。KtorはKotlinコルーチン上に構築されており、マルチプラットフォームをサポートしています。JetBrains、2025によると、Ktorはリフレクションや追加の依存関係なしでKotlinエコシステムとのネイティブ統合を提供します。

重要なポイント

  • Ktor — マルチプラットフォーム対応のKotlin製非同期HTTPクライアント
  • コルーチン — コールバックやリアクティブストリームなしでリクエストを実行する基盤
  • プラグイン — シリアライゼーション、ロギング、認可のためのモジュラー拡張システム
  • マルチプラットフォーム — Android、iOS、Desktop、Serverで共通のコード
  • Kotlinx Serialization — @Serializableによるリフレクション不要のネイティブシリアライゼーション

Ktorとは?

Ktorは、JetBrainsが作成したKotlinで非同期サーバーおよびクライアントアプリケーションを構築するためのフレームワークです。Ktor Clientはフレームワークのクライアント側部分であり、Kotlinコルーチン、マルチプラットフォーム(JVM、Native、JS)、およびモジュラープラグインベースのアーキテクチャを完全にサポートするHTTPクライアントを提供します。

Ktorは2018年に、Kotlinファーストのプロジェクト向けのRetrofitおよびOkHttpの代替として登場しました。アノテーションを使用したJavaアプローチを移植したRetrofitとは異なり、Ktor Clientはリクエスト設定にKotlin DSLを使用します。アノテーションやリフレクションは不要です。これにより、Kotlin開発者にとってコードの可読性と型安全性が向上します。

2024年のKotlin Multiplatform調査によると、Ktor ClientはKotlin Multiplatform Mobile(KMM)プロジェクトの35%で使用されており、KotlinコミュニティでOkHttpに次いで2番目に人気のあるHTTPクライアントとなっています。Ktorはマルチプラットフォーム対応とKotlinエコシステムとのネイティブ統合が重要なプロジェクトで好まれています。

Ktor Clientの仕組み

Ktor Clientのアーキテクチャはプラグインのパイプラインに基づいています。各リクエストは、リクエストやレスポンスを変更したり、ロギング、圧縮、シリアライゼーション、認証などの副作用を実行できるインストール済みプラグインのシーケンスを通過します。

HttpClient { } DSLブロックを介してHTTPクライアントを作成する際、エンジン(OkHttp、Android、CIO、Darwin)を指定し、プラグインをインストールします。各エンジンは特定のプラットフォーム向けの低レベルリクエスト送信を実装します:AndroidではOkHttpエンジン、iOSではDarwin(URLSession)、DesktopではCIO(Coroutine I/O)が使用されます。HttpClientは現在のプラットフォームに最適なエンジンを自動的に選択します。

Ktor Clientでのリクエストはsuspend関数を介して実行され、コルーチンとの完全な統合を意味します。コールバック、RxJava、LiveDataは不要で、スレッドをブロックせずに非同期で動作するsuspendを使用したシーケンシャルコードのみです。

リクエスト処理パイプライン

Ktorパイプラインはフェーズで構成されています:まずリクエストはインストールされたプラグイン(JSON用のContentNegotiation、ログ用のLoggingなど)を通過し、次にエンジンがHTTPリクエストを実行し、レスポンスはデシリアライゼーションのために再びプラグインを通過します。各プラグインはパイプラインコルーチン内で実行されるsuspend関数です。

Ktorパイプラインの重要な利点は、条件付き処理を実行できることです。プラグインはURLまたはリクエストヘッダーをチェックし、条件が満たされない場合は処理をスキップできます。たとえば、gzipを使用したContentEncodingは、Content-Encoding: gzipヘッダーを含むレスポンスにのみ適用され、Authは保護されたエンドポイントに対してのみトリガーされ、パブリックAPIには影響しません。

このパイプラインアプローチにより、プラグインを柔軟に組み合わせることができます:JSONを使用したContentNegotiationをインストールし、Bearerトークンを使用したAuthを追加し、ContentEncoding圧縮とHttpTimeoutを有効にすることができ、これらすべてが正しい順序で連携して動作します。プラグインのインストール順序は重要です:最初にインストールされたプラグインが他のプラグインよりも先にリクエストを処理します。

Ktor Clientプラグイン

プラグインはKtorのモジュラー拡張システムであり、RetrofitのアノテーションとOkHttpのインターセプターを置き換えます。各プラグインは特定のタスクを解決し、HttpClientブロック内のinstall()関数を介してインストールされます。Ktorは組み込みプラグインを提供し、カスタムプラグインの作成も許可します。

プラグイン目的
ContentNegotiationKotlinx SerializationによるJSON、XMLのシリアライゼーションとデシリアライゼーション
Logging設定可能なレベルでのリクエストとレスポンスのロギング
Auth認証:Basic、Bearer、Digest(自動トークンリフレッシュ付き)
HttpTimeout接続、読み取り、リクエストのタイムアウト設定
ContentEncoding透過的なgzipおよびdeflate圧縮
DefaultRequestすべてのリクエストのデフォルト値の設定

カスタムプラグイン

特定のタスクのために、createClientPluginを介してカスタムプラグインが作成されます。プラグインはリクエスト(onRequest)、レスポンス(onResponse)をインターセプトしたり、エラー(onError)を処理したりできます。これはOkHttpのInterceptorを完全に置き換えますが、型付けされたKotlin APIとsuspend関数のサポートを備えています。

カスタムプラグインは、メトリクスの追加、自動リトライロジック、リクエストトレーシング、またはエンドポイントのA/Bテストに便利です。OkHttpインターセプターとは異なり、KtorプラグインはKotlinで記述され、コルーチンコンテキストで実行されるため、エラーとタイムアウトの処理が簡素化されます。

リクエストのデバッグには、LoggingプラグインがALL、HEADERS、またはBODYレベルで使用されます。Loggingはメソッド、URL、ステータス、ヘッダー、リクエストとレスポンスのボディを出力します。OkHttpのHttpLoggingInterceptorとは異なり、Ktor Loggingは非同期で動作し、設定を変更するためにアプリケーションを停止することなく、ログレベル(ERROR、WARN、INFO、DEBUG)でフィルタリングするように設定できます。

KotlinでのKtor Clientコード例

Ktor Clientを使用した基本的なGETリクエストを見てみましょう。JSON用にContentNegotiationプラグインをインストールしてHttpClientを作成します。リクエストはsuspend関数get()を介して実行され、結果は自動的にデータクラスにデシリアライズされます。

kotlin
data class User(
    val login: String,
    val id: Int,
    val avatarUrl: String
)

val client = HttpClient {
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true
        })
    }
}

suspend fun getUser(): User {
    return client.get("https://api.github.com/users/octocat").body()
}

ボディ付きPOSTリクエストには、contentType()とbody()を指定してpost()関数を使用します。KtorはインストールされたContentNegotiationを介してオブジェクトを自動的にJSONにシリアライズします。DSLスタイルによりコードはシーケンシャルで読みやすくなります。

kotlin
data class CreateRepo(
    val name: String,
    val description: String,
    val private: Boolean
)

suspend fun createRepo(): Unit {
    val repo = CreateRepo(
        name = "my-project",
        description = "Sample project",
        private = false
    )
    client.post("https://api.github.com/user/repos") {
        contentType(ContentType.Application.Json)
        setBody(repo)
    }
}

タイムアウトとヘッダーの設定

HttpTimeoutDefaultRequestは設定のための2つの主要なプラグインです。HttpTimeoutは時間制限を設定し、DefaultRequestはすべてのリクエストのヘッダーとURLパラメーターを指定して、各呼び出しでのコード重複を排除します。

kotlin
val client = HttpClient {
    install(HttpTimeout) {
        connectTimeoutMillis = 15000
        requestTimeoutMillis = 30000
    }
    install(DefaultRequest) {
        url("https://api.github.com/")
        header("Accept", "application/json")
    }
}

Ktorのマルチプラットフォーム対応

マルチプラットフォームは、OkHttpやRetrofitに対するKtorの主な利点です。Ktor ClientはJVM(Android、Server)、Native(iOS、macOS、Windows、Linux)、JS(Browser)で動作します。同じHTTPクライアントコードが変更なしですべてのプラットフォームで実行され、これはKotlin Multiplatformプロジェクトにとって特に価値があります。

各プラットフォームに対して、Ktorは独自のエンジンを使用します。AndroidではデフォルトでOkHttpエンジンが使用され、OkHttpエコシステムとの完全な互換性を提供します。iOSではURLSessionベースのDarwinEngineが使用されます。サーバーにはCIOEngine(Coroutine I/O)が使用されます。エンジンは明示的に指定することもできます:HttpClient(OkHttp) { } または HttpClient(Darwin) { }。

エンジンを選択する際は、その機能を考慮してください:OkHttpエンジンはHTTP/2とコネクションプーリングをサポートし、DarwinEngineはネイティブiOSネットワーク統合とバックグラウンドURLSessionセッションを提供し、CIOEngineは外部依存関係のない純粋なコルーチン実装です。Webターゲットには、fetch APIを介して動作するJsEngineまたはBrowserEngineが使用されます。

すべてのプラットフォームで統一されたAPIのおかげで、データをロードするコードはAndroid、iOS、Desktopで同じように見えます。これにより、Retrofit(Android)とURLSession(iOS)での個別の実装と比較して、KMMプロジェクトでのコード重複が60~80%削減されます。プラグインも変更なしですべてのプラットフォームで動作します。

Ktor使用時のよくある間違い

HttpClientのクローズの無視はKtorでのよくある間違いです。HttpClientはCloseableを実装しており、アプリケーション終了時にclient.close()を介してクローズする必要があります。Androidでは、ActivityのonDestroy()またはViewModel.onCleared()でこれを行います。クローズされていないクライアントは、コルーチンとエンジンスレッドのリークにつながります。

プラグインの順序の誤りはリクエスト処理を壊す可能性があります。たとえば、ContentNegotiationはDefaultRequestの前にインストールして、コンテンツタイプが正しく適用されるようにする必要があります。Loggingは、すべての変更後のリクエストの最終バージョンをログに記録するために、最後にインストールすることをお勧めします。プラグインが予期しない動作をする場合は、順序を試してみてください。

suspend関数での例外処理の欠如。Ktorはネットワークエラーに対してIOExceptionを、HTTP 4xxステータスに対してClientRequestExceptionをスローします。get()、post()、およびその他のメソッドの呼び出しごとにtry-catchブロックが必須です。各メソッドでtry-catchを重複させずにグローバルエラー処理を行うには、HttpClientブロックでHttpResponseValidatorを使用してください。

よくある質問

KtorとRetrofitの違いは何ですか?

KtorはアノテーションやリフレクションなしでKotlin DSLとプラグインを使用します。RetrofitはJavaアノテーションとリフレクションに基づいて構築されています。Ktorはマルチプラットフォームをサポートし、RetrofitはJVM/Androidのみです。Ktorはネイティブでコルーチンと連携し、Retrofitはラッパーを介してsuspendを追加しました。

Androidに最適なKtorエンジンはどれですか?

AndroidにはOkHttpエンジンが最適です。OkHttpエコシステムとの互換性、コネクションプーリング、キャッシング、HTTP/2を提供します。HttpClient(OkHttp) { } を介して選択します。代替としてKtorに組み込まれているCIOEngineがありますが、Androidでは安定性が劣ります。

KtorはHTTP/2をサポートしていますか?

はい、Ktorは適切なエンジンを介してHTTP/2をサポートしています。OkHttpエンジンはOkHttpからHTTP/2サポートを継承します。iOSのDarwinEngineはURLSessionを介してHTTP/2をサポートします。CIOEngineはサーバー側でHTTP/2をサポートします。エンジンの選択がプロトコルサポートのレベルを決定します。

Ktor Clientで認証を設定するには?

bearer { } 設定でAuthプラグインを使用します。プラグインは各リクエストに自動的にAuthorizationヘッダーを追加し、refreshTokensを介して401レスポンスでトークンを更新できます。例:install(Auth) { bearer { loadTokens { BearerTokens(token, refreshToken) } } }。

iOSでKtor Clientを使用できますか?

はい、Ktor ClientはURLSessionを使用するDarwinEngineを介してiOSで完全に動作します。すべてのプラグイン、シリアライゼーション、コルーチンはAndroidと同じようにiOSで動作します。これにより、KtorはKotlin Multiplatform Mobile(KMM)プロジェクトの主要なHTTPクライアントとなっています。

まとめ

  • Ktor — JetBrains製のマルチプラットフォーム対応非同期HTTPクライアント
  • Kotlin DSLがアノテーションを置き換え — リフレクションなしのプログラムブロックによる設定
  • プラグイン ContentNegotiation、Auth、Logging、HttpTimeoutが機能をモジュール拡張
  • コルーチン — 実行基盤:コールバックやリアクティブストリームなしの全suspendメソッド
  • マルチプラットフォーム — Android、iOS、Desktop、Server、JSで共通コード
  • エンジン OkHttp、Darwin、CIOがKtorを特定プラットフォームに適応
  • HttpResponseValidatorがtry-catchの重複なしでHTTPエラー処理を一元化

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください