DoubleReceive
必要相依性:io.ktor:ktor-server-double-receive
程式碼範例: double-receive
DoubleReceive 外掛程式提供了多次接收請求主體的能力,且不會拋出 RequestAlreadyConsumedException 例外。 如果某個 外掛程式 已經耗盡了請求主體,導致您無法在路由處理常式中再次接收它,這個功能就會非常有用。 例如,您可以使用 DoubleReceive 透過 CallLogging 外掛程式記錄請求主體,然後在 post 路由處理常式 中再次接收該主體。
DoubleReceive外掛程式使用的是實驗性 API,預計在未來的更新中可能會有所演進,並可能包含破壞性變更。
新增相依性
若要使用 DoubleReceive,您需要在組建指令碼中包含 ktor-server-double-receive 構件:
安裝 DoubleReceive
若要將 DoubleReceive 外掛程式安裝到應用程式,請將其傳遞給指定
install 函式。 下方的程式碼片段展示了如何安裝 DoubleReceive ... - ... 在
embeddedServer函式呼叫內。 - ... 在明確定義的
module內,該模組是Application類別的擴充函式。
DoubleReceive 外掛程式也可以 安裝到特定路由。 如果您需要為不同的應用程式資源設定不同的 DoubleReceive 組態,這會非常有用。
安裝 DoubleReceive 後,您可以多次 接收請求主體,且每次調用都會回傳相同的執行個體。 例如,您可以使用 CallLogging 外掛程式啟用請求主體的記錄功能...
install(CallLogging) {
level = Level.TRACE
format { call ->
runBlocking {
"Body: ${call.receiveText()}"
}
}
}... 然後在路由處理常式中再次獲取請求主體。
post("/") {
val receivedText = call.receiveText()
call.respondText("Text '$receivedText' is received")
}您可以在此處找到完整的範例:double-receive。
組態 DoubleReceive
在預設組態下,DoubleReceive 提供了將 接收請求主體 轉換為以下型別的能力:
ByteArrayStringParameters- 被
ContentNegotiation外掛程式使用的 資料類別 (data class)
預設情況下,DoubleReceive 不支援:
- 從同一個請求接收不同的型別;
- 接收 串流 (stream) 或通道 (channel)。
如果您不需要從同一個請求接收不同的型別,或者不需要接收串流或通道,請將 cacheRawRequest 屬性設定為 false:
install(DoubleReceive) {
cacheRawRequest = false
}