Skip to content
Server Plugin

DoubleReceive

필수 의존성: io.ktor:ktor-server-double-receive

코드 예제: double-receive

네이티브 서버
Ktor는 Kotlin/Native를 지원하며 추가 런타임이나 가상 머신 없이 서버를 실행할 수 있게 해줍니다.
지원: ✅

DoubleReceive 플러그인은 RequestAlreadyConsumedException 예외 없이 요청 본문(request body)을 여러 번 수신할 수 있는 기능을 제공합니다. 이는 특정 플러그인이 이미 요청 본문을 소비하여 라우트 핸들러 내부에서 본문을 수신할 수 없는 경우에 유용할 수 있습니다. 예를 들어, DoubleReceive을 사용하여 CallLogging 플러그인으로 요청 본문을 로깅한 다음, post 라우트 핸들러 내부에서 본문을 한 번 더 수신할 수 있습니다.

DoubleReceive 플러그인은 실험용(experimental) API를 사용하며, 향후 업데이트에서 파괴적 변경(breaking changes)이 발생할 수 있습니다.

의존성 추가

DoubleReceive을 사용하려면 빌드 스크립트에 ktor-server-double-receive 아티팩트를 포함해야 합니다:

Kotlin
Groovy
XML

DoubleReceive 설치

애플리케이션에 DoubleReceive 플러그인을 설치하려면, 지정된

모듈
모듈을 사용하면 라우트를 그룹화하여 애플리케이션 구조를 잡을 수 있습니다.
install 함수에 전달하십시오. 아래 코드 스니펫은 DoubleReceive을 설치하는 방법을 보여줍니다...

  • ... embeddedServer 함수 호출 내부에서 설치.
  • ... Application 클래스의 확장 함수인 명시적으로 정의된 module 내부에서 설치.
kotlin
kotlin

DoubleReceive 플러그인은 특정 라우트에 설치할 수도 있습니다. 이는 서로 다른 애플리케이션 리소스에 대해 서로 다른 DoubleReceive 구성이 필요한 경우 유용할 수 있습니다.

DoubleReceive을 설치한 후에는 요청 본문을 수신할 때 여러 번 호출하더라도 매번 동일한 인스턴스를 반환합니다. 예를 들어, CallLogging 플러그인을 사용하여 요청 본문의 로깅을 활성화할 수 있습니다...

kotlin
install(CallLogging) {
    level = Level.TRACE
    format { call ->
        runBlocking {
            "Body: ${call.receiveText()}"
        }
    }
}

... 그런 다음 라우트 핸들러 내부에서 요청 본문을 한 번 더 가져올 수 있습니다.

kotlin
post("/") {
    val receivedText = call.receiveText()
    call.respondText("Text '$receivedText' is received")
}

전체 예제는 여기에서 확인할 수 있습니다: double-receive.

DoubleReceive 구성

기본 구성을 사용하면 DoubleReceive요청 본문을 다음과 같은 타입으로 수신할 수 있는 기능을 제공합니다:

기본적으로 DoubleReceive은 다음을 지원하지 않습니다:

동일한 요청에서 서로 다른 타입을 수신하거나 스트림 또는 채널을 수신할 필요가 없는 경우 cacheRawRequest 속성을 false로 설정하십시오:

kotlin
install(DoubleReceive) {
    cacheRawRequest = false
}