【问题标题】:Ktor http client - request progressKtor http 客户端 - 请求进度
【发布时间】:2020-02-25 17:18:22
【问题描述】:

如何在 Ktor http 客户端监控请求进度?

例如:我有这样的要求:

val response = HttpClient().get<String>("https://stackoverflow.com/")

我想用这样的进度条监控请求进度:

fun progress(downloaded: Long, contentLength: Long) {
    // Update progress bar or whatever
}

如何设置progress()被HttpClient调用?

编辑:这是 Kotlin 多平台项目。相关依赖有:

implementation 'io.ktor:ktor-client-core:1.2.5'
implementation 'io.ktor:ktor-client-cio:1.2.5'

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    从 Ktor 1.6.0 开始,您可以使用 HttpRequestBuilder 公开的 onDownload 扩展功能对下载进度更改做出反应:

    val channel = get<ByteReadChannel>("https://ktor.io/") {
        onDownload { bytesSentTotal, contentLength ->
            println("Received $bytesSentTotal bytes from $contentLength")
        }
    }
    

    还有onUpload函数可以用来显示上传进度:

    onUpload { bytesSentTotal, contentLength ->
        println("Sent $bytesSentTotal bytes from $contentLength")
    }
    

    以下是 Ktor 文档中的可运行示例:

    【讨论】:

      【解决方案2】:

      如何将下载进度发送到 Flow 中?

      我想通过一个Flow来观察下载进度,所以我写了一个这样的函数:

      suspend fun downloadFile(file: File, url: String): Flow<Int>{
              val client = HttpClient(Android)
              return flow{
                  val httpResponse: HttpResponse = client.get(url) {
                      onDownload { bytesSentTotal, contentLength ->
                          val progress = (bytesSentTotal * 100f / contentLength).roundToInt()
                          emit(progress)
                      }
                  }
                  val responseBody: ByteArray = httpResponse.receive()
                  file.writeBytes(responseBody)
              }
      }
      

      onDownload 只会被调用一次。如果我删除 emit(progress) 它将起作用。

      @andrey-aksyonov

      【讨论】:

        猜你喜欢
        • 2019-04-09
        • 1970-01-01
        • 2022-12-26
        • 1970-01-01
        • 2022-06-20
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多