DoubleReceive
필수 의존성: io.ktor:ktor-server-double-receive
코드 예제: double-receive
DoubleReceive 플러그인은 RequestAlreadyConsumedException 예외 없이 요청 본문(request body)을 여러 번 수신할 수 있는 기능을 제공합니다. 이는 특정 플러그인이 이미 요청 본문을 소비하여 라우트 핸들러 내부에서 본문을 수신할 수 없는 경우에 유용할 수 있습니다. 예를 들어, DoubleReceive을 사용하여 CallLogging 플러그인으로 요청 본문을 로깅한 다음, post 라우트 핸들러 내부에서 본문을 한 번 더 수신할 수 있습니다.
DoubleReceive플러그인은 실험용(experimental) API를 사용하며, 향후 업데이트에서 파괴적 변경(breaking changes)이 발생할 수 있습니다.
의존성 추가
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은 요청 본문을 다음과 같은 타입으로 수신할 수 있는 기능을 제공합니다:
ByteArrayStringParametersContentNegotiation플러그인에서 사용하는 데이터 클래스(data classes)
기본적으로 DoubleReceive은 다음을 지원하지 않습니다:
- 동일한 요청에서 서로 다른 타입을 수신하는 것
- 스트림 또는 채널(stream or channel)을 수신하는 것
동일한 요청에서 서로 다른 타입을 수신하거나 스트림 또는 채널을 수신할 필요가 없는 경우 cacheRawRequest 속성을 false로 설정하십시오:
install(DoubleReceive) {
cacheRawRequest = false
}