DoubleReceive
필수 의존성: io.ktor:ktor-server-double-receive
코드 예시: double-receive
DoubleReceive 플러그인은 RequestAlreadyConsumedException
예외 없이 요청 바디를 여러 번 수신할 수 있는 기능을 제공합니다. 이는 플러그인이 요청 바디를 이미 소비하여 라우트 핸들러 내에서 이를 수신할 수 없는 경우에 유용할 수 있습니다. 예를 들어, CallLogging 플러그인을 사용하여 요청 바디를 로깅한 다음, post
라우트 핸들러 내에서 바디를 한 번 더 수신하는 데 DoubleReceive
을 사용할 수 있습니다.
DoubleReceive
플러그인은 향후 업데이트에서 잠재적으로 호환성이 깨지는 변경 사항과 함께 발전할 것으로 예상되는 실험적인 API를 사용합니다.
의존성 추가
DoubleReceive
을 사용하려면 빌드 스크립트에 ktor-server-double-receive
아티팩트를 포함해야 합니다:
DoubleReceive 설치
애플리케이션에 DoubleReceive
플러그인을 설치하려면, 지정된
install
함수에 전달하세요. 아래 코드 스니펫은 DoubleReceive
을 설치하는 방법을 보여줍니다... - ...
embeddedServer
함수 호출 내에서. - ...
Application
클래스의 확장 함수인 명시적으로 정의된module
내에서.
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
은 요청 바디를 다음 타입으로 수신하는 기능을 제공합니다:
ByteArray
String
Parameters
ContentNegotiation
플러그인에서 사용되는 데이터 클래스
기본적으로 DoubleReceive
은 다음을 지원하지 않습니다:
- 동일한 요청에서 다른 타입을 수신하는 것;
- 스트림 또는 채널을 수신하는 것.
동일한 요청에서 다른 타입을 수신하거나 스트림 또는 채널을 수신할 필요가 없다면 cacheRawRequest
속성을 false
로 설정하세요:
install(DoubleReceive) {
cacheRawRequest = false
}