9

我得到了这样的东西:

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
    }
}

但我需要检查请求和响应正文,有什么办法吗?在控制台/文件中?

4

5 回答 5

9

我也遇到了这个。我切换到使用Ktor OkHttp 客户端,因为我熟悉那里的日志记录机制。

更新您的pom.xmlorgradle.build以包含该客户端(从 Ktor 站点复制/粘贴)并添加OkHttp 日志记录拦截器(再次,从该站点复制/粘贴)。当前版本是3.12.0.

现在配置客户端

val client = HttpClient(OkHttp) {
    engine {
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level = Level.BODY
        addInterceptor(loggingInterceptor)
    }
}
于 2018-12-03T11:40:07.147 回答
8

Logging您可以使用该功能实现此目的。

首先添加依赖:

implementation "io.ktor:ktor-client-logging-native:$ktor_version"

然后安装该功能:

private val client = HttpClient {
   install(Logging) {
      logger = Logger.DEFAULT
      level = LogLevel.ALL
   }
}

奖金:

如果您需要在HttpClient整个应用程序中拥有多个实例并且想要重用某些配置,那么您可以创建一个扩展函数并在其中添加通用逻辑。例如:

fun HttpClientConfig<*>.default() {
    install(Logging) {
        logger = Logger.DEFAULT
        level = LogLevel.ALL
    }

    // Add all the common configuration here.
}

然后像这样初始化你HttpClient

private val client = HttpClient {
   default()
}
于 2019-11-16T11:58:48.850 回答
7

无论您使用哪个客户端或使用哪个框架,您都可以像这样实现自己的记录器:

private val client = HttpClient {
    // Other configurations...
    install(Logging) {
        logger = CustomHttpLogger()
        level = LogLevel.BODY
    }
}

CustomHttpLogger实现 ktor Logger 接口的任何类在哪里,如下所示:

import io.ktor.client.features.logging.Logger

class CustomHttpLogger(): Logger {
    override fun log(message: String) {
        Log.d("loggerTag", message) // Or whatever logging system you want here
    }
}

您可以在此处的文档或此处的源代码中阅读有关 Logger 接口的更多信息

于 2020-06-28T14:22:35.263 回答
1

看起来我们应该处理responsein 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 和将在下一个次要版本中作为客户端功能提供。

顺便说一句:我们可以为请求实施相同的方案。

于 2018-11-08T09:08:35.163 回答
-4

查看 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" }

这将在控制台上打印消息。

于 2018-11-06T08:28:08.860 回答