ExpressからKtorへの移行
このガイドでは、基本的なシナリオにおけるExpressアプリケーションからKtorへの移行方法について説明します。アプリケーションの生成から最初のアプリケーションの記述、そしてアプリケーション機能を拡張するためのミドルウェアの作成までを扱います。
アプリケーションを生成する
Express |
shell |
Ktor | Ktorは、アプリケーションのスケルトンを生成する以下の方法を提供します。
詳細な手順については、 新しいKtorプロジェクトを作成、開く、実行する チュートリアルを参照してください。 Ktorでサーバーアプリケーションを開き、実行し、テストする方法を学びます。 |
Hello world
このセクションでは、GET
リクエストを受け入れ、事前定義されたプレーンテキストで応答する最もシンプルなサーバーアプリケーションを作成する方法を見ていきます。
Express | 以下の例は、サーバーを起動し、ポート 3000 で接続をリッスンするExpressアプリケーションを示しています。 javascript 完全な例については、 1_hello プロジェクトを参照してください。 |
Ktor | Ktorでは、embeddedServer 関数を使用してコード内でサーバーパラメータを設定し、アプリケーションを素早く実行できます。 kotlin 完全な例については、 1_hello プロジェクトを参照してください。 また、HOCONまたはYAML形式を使用する外部設定ファイルでサーバー設定を指定することもできます。 |
上記のExpressアプリケーションは、 Date 、 X-Powered-By 、および ETag 応答ヘッダーを追加することに注意してください。これらは次のようになります。
Ktorの各レスポンスにデフォルトの Server および Date ヘッダーを追加するには、
静的コンテンツの提供
このセクションでは、ExpressとKtorで画像、CSSファイル、JavaScriptファイルなどの静的ファイルをどのように提供するかを見ていきます。 public フォルダにメインの index.html ページと、それにリンクされた一連のアセットがあるとします。
Express | Expressでは、フォルダ名を express.static 関数に渡します。 javascript 完全な例については、 2_static プロジェクトを参照してください。 |
Ktor | Ktorでは、 kotlin 完全な例については、2_static プロジェクトを参照してください。 |
静的コンテンツを提供する場合、Expressは次のような応答ヘッダーをいくつか追加します。
Ktorでこれらのヘッダーを管理するには、以下のプラグインをインストールする必要があります。
Accept-Ranges :
PartialContent必要な依存関係: io.ktor:%artifact_name% サーバー例: download-file, クライアント例: client-download-file-range ネイティブサーバーサポート: ✅Cache-Control :
CachingHeaders必要な依存関係: io.ktor:%artifact_name% コード例: %example_name% ネイティブサーバーサポート: ✅ETag および Last-Modified :
ConditionalHeaders必要な依存関係: io.ktor:%artifact_name% コード例: %example_name% ネイティブサーバーサポート: ✅
ルーティング
GET
、POST
など)とパスによって定義される、特定のエンドポイントへの受信リクエストを処理できます。 以下の例は、/パスへのGET
および POST
リクエストを処理する方法を示しています。 Express | javascript 完全な例については、 3_router プロジェクトを参照してください。 |
Ktor | kotlin TIP
完全な例については、 3_router プロジェクトを参照してください。 |
以下の例は、パスごとにルートハンドラーをグループ化する方法を示しています。
Express | Expressでは、 javascript 完全な例については、 3_router プロジェクトを参照してください。 |
Ktor | Ktorは kotlin 完全な例については、 3_router プロジェクトを参照してください。 |
どちらのフレームワークも、関連するルートを単一のファイルにグループ化することを可能にします。
Express | Expressは、マウント可能なルートハンドラーを作成するために javascript javascript 完全な例については、 3_router プロジェクトを参照してください。 |
Ktor | Ktorでは、一般的なパターンとして、 kotlin kotlin 完全な例については、 3_router プロジェクトを参照してください。 |
URLパスを文字列として指定する以外に、Ktorには
ルートパラメータとクエリパラメータ
このセクションでは、ルートパラメータとクエリパラメータにアクセスする方法を示します。
ルート(またはパス)パラメータは、URL内のその位置で指定された値をキャプチャするために使用される、名前付きのURLセグメントです。
Express | Expressでルートパラメータにアクセスするには、 javascript 完全な例については、 4_parameters プロジェクトを参照してください。 |
Ktor | Ktorでは、ルートパラメータは kotlin 完全な例については、 4_parameters プロジェクトを参照してください。 |
以下の表は、クエリ文字列のパラメータにアクセスする方法を比較しています。
Express | Expressでルートパラメータにアクセスするには、 javascript 完全な例については、 4_parameters プロジェクトを参照してください。 |
Ktor | Ktorでは、ルートパラメータは kotlin 完全な例については、 4_parameters プロジェクトを参照してください。 |
レスポンスの送信
これまでのセクションでは、プレーンテキストコンテンツで応答する方法を見てきました。 JSON、ファイル、およびリダイレクト応答を送信する方法を見ていきましょう。
JSON
Express | Expressで適切なコンテンツタイプを含むJSONレスポンスを送信するには、 javascript 完全な例については、 5_send_response プロジェクトを参照してください。 |
Ktor | Ktorでは、 ContentNegotiation プラグインをインストールし、 JSONシリアライザを設定する必要があります。 ContentNegotiationプラグインには、クライアントとサーバー間でメディアタイプをネゴシエートすること、およびコンテンツを特定の形式でシリアライズ/デシリアライズすることという2つの主要な目的があります。 kotlin データをJSONにシリアライズするには、 kotlin 次に、 kotlin 完全な例については、 5_send_response プロジェクトを参照してください。 |
ファイル
Express | Expressでファイルで応答するには、 javascript 完全な例については、 5_send_response プロジェクトを参照してください。 |
Ktor | Ktorは、クライアントにファイルを送信するための kotlin 完全な例については、 5_send_response プロジェクトを参照してください。 |
Expressアプリケーションは、ファイルで応答する際に Accept-Ranges HTTP応答ヘッダーを追加します。 サーバーは、ファイルダウンロードのためのクライアントからの部分的なリクエストのサポートを宣伝するためにこのヘッダーを使用します。 Ktorでは、部分的なリクエストをサポートするために
ファイル添付
Express |
javascript 完全な例については、 5_send_response プロジェクトを参照してください。 |
Ktor | Ktorでは、ファイルを添付ファイルとして転送するために、 Content-Disposition ヘッダーを手動で設定する必要があります。 kotlin 完全な例については、 5_send_response プロジェクトを参照してください。 |
リダイレクト
Express | Expressでリダイレクト応答を生成するには、 javascript 完全な例については、 5_send_response プロジェクトを参照してください。 |
Ktor | Ktorでは、 kotlin 完全な例については、 5_send_response プロジェクトを参照してください。 |
テンプレート
ExpressとKtorの両方で、ビューを扱うためのテンプレートエンジンを使用できます。
Express | 以下に示すPugテンプレートが views フォルダにあるとします。 このテンプレートで応答するには、 javascript 完全な例については、 6_templates プロジェクトを参照してください。 |
Ktor | Ktorは、FreeMarker、Velocityなど、いくつかの JVMテンプレートエンジン をサポートしています。 例えば、アプリケーションリソースに配置されたFreeMarkerテンプレートで応答する必要がある場合、 HTML/CSSまたはJVMテンプレートエンジンで構築されたビューを扱う方法を学びます。 FreeMarker プラグインをインストールして設定し、 call.respond を使用してテンプレートを送信します。 kotlin 完全な例については、 6_templates プロジェクトを参照してください。 |
リクエストの受信
このセクションでは、さまざまな形式でリクエストボディを受信する方法を示します。
生テキスト
以下のPOST
リクエストは、テキストデータをサーバーに送信します。
このリクエストの本文をサーバー側でプレーンテキストとして受信する方法を見てみましょう。
Express | Expressで受信リクエストボディをパースするには、 javascript
javascript 完全な例については、 7_receive_request プロジェクトを参照してください。 |
Ktor | Ktorでは、 kotlin 完全な例については、 7_receive_request プロジェクトを参照してください。 |
JSON
このセクションでは、JSONボディを受信する方法を見ていきます。 以下のサンプルは、JSONオブジェクトをボディに含むPOST
リクエストを示しています。
Express | ExpressでJSONを受信するには、 javascript 完全な例については、 7_receive_request プロジェクトを参照してください。 |
Ktor | Ktorでは、 ContentNegotiation プラグインをインストールし、 ContentNegotiationプラグインには、クライアントとサーバー間でメディアタイプをネゴシエートすること、およびコンテンツを特定の形式でシリアライズ/デシリアライズすることという2つの主要な目的があります。 Json シリアライザーを設定する必要があります。 kotlin 受信したデータをオブジェクトにデシリアライズするには、データクラスを作成する必要があります。 kotlin 次に、このデータクラスをパラメータとして受け入れる kotlin 完全な例については、 7_receive_request プロジェクトを参照してください。 |
URLエンコード
次に、 application/x-www-form-urlencoded タイプを使用して送信されたフォームデータを受信する方法を見ていきましょう。 以下のコードスニペットは、フォームデータを含むサンプルPOST
リクエストを示しています。
Express | プレーンテキストやJSONと同様に、Expressでは javascript 完全な例については、 7_receive_request プロジェクトを参照してください。 |
Ktor | Ktorでは、 kotlin 完全な例については、 7_receive_request プロジェクトを参照してください。 |
生データ
次のユースケースはバイナリデータの処理です。 以下のリクエストは、 application/octet-stream タイプでPNG画像をサーバーに送信します。
Express | Expressでバイナリデータを扱うには、パーサーのタイプを javascript 完全な例については、 7_receive_request プロジェクトを参照してください。 |
Ktor | Ktorは、バイトシーケンスの非同期読み書きのために kotlin 完全な例については、 7_receive request プロジェクトを参照してください。 |
マルチパート
最後のセクションでは、マルチパートボディの処理方法を見ていきましょう。 以下のPOST
リクエストは、 multipart/form-data タイプを使用して、説明付きのPNG画像を送信します。
Express | Expressは、マルチパートデータをパースするために別のモジュールを必要とします。 以下の例では、 multer がファイルをサーバーにアップロードするために使用されています。 javascript 完全な例については、 7_receive_request プロジェクトを参照してください。 |
Ktor | Ktorでは、マルチパートリクエストの一部として送信されたファイルを受信する必要がある場合、 kotlin 完全な例については、 7_receive_request プロジェクトを参照してください。 |
ミドルウェアの作成
最後に見ていくのは、サーバー機能を拡張できるミドルウェアの作成方法です。 以下の例は、ExpressとKtorを使用してリクエストロギングを実装する方法を示しています。
Express | Expressでは、ミドルウェアは javascript 完全な例については、 8_middleware プロジェクトを参照してください。 |
Ktor | Ktorは、 カスタムプラグイン を使用してその機能を拡張できます。 以下のコード例は、リクエストロギングを実装するために独自のカスタムプラグインを作成する方法を学びます。 onCall を処理する方法を示しています。 kotlin 完全な例については、 8_middleware プロジェクトを参照してください。 |
次のステップ
このガイドでは、セッション管理、認可、データベース統合など、まだ多くのユースケースがカバーされていません。 これらの機能のほとんどについて、Ktorはアプリケーションにインストールして必要に応じて設定できる専用のプラグインを提供しています。 Ktorでの学習を続けるには、ステップバイステップのガイドとすぐに使えるサンプルが提供されている Learnページ にアクセスしてください。