Express から Ktor への移行
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 ファイルなどの静的ファイルを配信する方法を見ていきます。 メインの index.html ページとリンクされたアセット一式が含まれる public フォルダーがあると仮定します。
| 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-rangeCache-Control:
CachingHeaders必要な依存関係: io.ktor:%artifact_name%ETag および Last-Modified:
ConditionalHeaders必要な依存関係: io.ktor:%artifact_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 レスポンスヘッダーを追加します。 サーバーはこのヘッダーを使用して、クライアントからのファイルダウンロードの部分リクエスト(Partial requests)のサポートを通知します。 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 | views フォルダーに次の Pug テンプレートがあると仮定します。 このテンプレートで応答するには、 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 での開発を続けるには、一連のステップバイステップのガイドとすぐに使えるサンプルを提供している学習ページにアクセスしてください。
