從 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 檔案等靜態檔案。 假設我們有一個 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-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 外掛程式有兩個主要目的:在用戶端與伺服器之間協商媒體類型,以及以特定格式對內容進行序列化/還原序列化。 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 都能夠配合範本引擎來處理檢視 (views)。
| Express | 假設我們在 views 資料夾中有以下的 Pug 範本: 要以該範本回應,請呼叫 javascript 如需完整範例,請參閱 6_templates 專案。 |
| Ktor | Ktor 支援數種 JVM 範本引擎 , 如 FreeMarker、Velocity 等。 例如,如果您需要以放置在應用程式資源中的 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 外掛程式有兩個主要目的:在用戶端與伺服器之間協商媒體類型,以及以特定格式對內容進行序列化/還原序列化。 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 專案。 |
多部分 (Multipart)
在最後一節中,讓我們來看看如何處理 多部分 (multipart) 主體。 下方的 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 旅程, 請造訪 學習頁面, 其中提供了一系列的逐步指南與開箱即用的範例。
