Как регистрировать запросы в http клиенте ktor? - PullRequest
0 голосов
/ 06 ноября 2018

Я получил что-то вроде этого:

private val client = HttpClient {
    install(JsonFeature) {
        serializer = GsonSerializer()
    }
    install(ExpectSuccess)
}

и сделать запрос как

  private fun HttpRequestBuilder.apiUrl(path: String, userId: String? = null) {
    header(HttpHeaders.CacheControl, "no-cache")
    url {
        takeFrom(endPoint)
        encodedPath = path
    }
}

но мне нужно проверить тело запроса и ответа, есть ли способ сделать это? в консоли / в файле?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Похоже, мы должны обработать response в HttpReceivePipeline. Мы могли бы клонировать исходный ответ и использовать его для целей регистрации:

scope.receivePipeline.intercept(HttpReceivePipeline.Before) { response ->
    val (loggingContent, responseContent) = response.content.split(scope)

    launch {
        val callForLog = DelegatedCall(loggingContent, context, scope, shouldClose = false)
        ....
    }
    ...
}

Пример реализации можно найти здесь: https://github.com/ktorio/ktor/blob/00369bf3e41e91d366279fce57b8f4c97f927fd4/ktor-client/ktor-client-core/src/io/ktor/client/features/observer/ResponseObserver.kt и будет доступен в следующем вспомогательном выпуске в качестве клиентской функции.

Кстати: мы могли бы реализовать ту же схему для запроса.

0 голосов
/ 03 декабря 2018

Я тоже столкнулся с этим. Я перешел на использование клиента Ktor OkHttp , так как я знаком с механизмом ведения журнала там.

Обновите pom.xml или gradle.build, чтобы включить этот клиент (скопируйте / вставьте с сайта Ktor), а также добавьте OkHttp Logging Interceptor (снова скопируйте / вставьте с этого сайта). Текущая версия 3.12.0.

Теперь настройте клиент с

val client = HttpClient(OkHttp) {
    engine {
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level = Level.BODY
        addInterceptor(loggingInterceptor)
    }
}
0 голосов
/ 06 ноября 2018

Проверьте Kotlin Logging, https://github.com/MicroUtils/kotlin-logging он используется многими открытыми фреймворками и заботится обо всей предварительной печати. ​​

Вы можете использовать его просто так:

 private val logger = KotlinLogging.logger {  }
 logger.info { "MYLOGGER INFO" }
 logger.warn { "MYLOGGER WARNING" }
 logger.error { "MYLOGGER ERROR" }

Это напечатает сообщения на консоли.

...