如何根据响应状态代码将 ktor 响应映射到对象

Posted

技术标签:

【中文标题】如何根据响应状态代码将 ktor 响应映射到对象【英文标题】:How to map ktor response to object depending on response status code 【发布时间】:2021-07-07 06:35:31 【问题描述】:

假设我做了一个简单的请求:

get("/getUser/$userId")

结果可能执行成功并返回Stringstatus=200 或者可能完成并返回status=400 和错误对象:


  "errorMessage": "Something went wrong!"

我想将所有响应映射到一个公共对象:

data class Response<T>(
  val success: Boolean,
  val result: T,
  val error: Map<String, String>
)

是否有任何可能的解决方案将成功而不是成功结果映射到一个公共对象?

【问题讨论】:

【参考方案1】:

您可以拦截HttpResponsePipelineTransform 阶段,以便能够将任何响应转换为Response 类型:

import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*

suspend fun main() 
    val client = HttpClient(CIO) 
        expectSuccess = false
    

    client.responsePipeline.intercept(HttpResponsePipeline.Transform)  (info, body) ->
        val response = when (context.response.status) 
            HttpStatusCode.OK -> Response(success = true, result = body, error = emptyMap())
            HttpStatusCode.BadRequest -> Response(success = false, result = body, error = mapOf("error" to "Some error"))
            else -> error("Cannot map status code $context.response.status")
        

        proceedWith(HttpResponseContainer(info, response))
    

    val r = client.get<Response<Any>>("https://httpbin.org/status/400")
    println(r.success)

【讨论】:

以上是关于如何根据响应状态代码将 ktor 响应映射到对象的主要内容,如果未能解决你的问题,请参考以下文章

当响应时间超过 requestReadTimeoutSeconds 时,KTor 将终止 GET 请求

在 REST Assured 中,将响应映射到对象时如何解决 UnrecognizedPropertyException?

Kotlin Multiplatform - 使用 Ktor 处理响应 http 代码和异常

如何记录并响应来自 Ktor 中 JWT 授权失败的错误消息?

rest-assured之验证响应数据(Verifying Response Data)

Ktor 客户端:使用代码 200 处理错误