如何使用Ktor和kotlinx序列化获取HttpCall的状态码

How to get status code of HttpCall with Ktor and kotlinx serialization

我正在尝试弄清楚如何使用 Ktor

检查 http 请求的 http 状态代码

我有一个像这样的简单 GET 请求,其中包含一个 HttpResponseObject,它保存服务器 returns 的数据以及我控制的服务器端的任何错误

val response:HttpResponseObject<MyObject> = client.get<HttpResponseObject<MyObject>>(url)

现在我还需要能够检查的是服务器是否抛出未处理的异常或身份验证异常。在这些情况下,服务器不会返回任何内容,并且会返回状态代码 500 或 401 错误。

我看到文档中有这样的内容可以得到完整的 http 响应

val response:HttpResponse client.get(url)

但是如何丢失我的序列化数据回来,我找不到任何关于如何从 HttpResponse 对象序列化它的示例。

有人有什么建议吗?有没有办法从我的第一个示例中获取 http 状态代码?

您可以尝试使用以下代码获取状态码: val response = client.get<HttpResponse>(url) 之后,要从响应中获取字节并将其序列化,您可以尝试使用 val bytes: ByteArray = response.readBytes()

您可以在此处找到完整的文档: https://ktor.io/clients/http-client/quick-start/responses.html

我最后做的是使用 HttpClientConfig 中的 HttpResponseValidator 来捕获状态代码然后抛出异常

HttpResponseValidator{

            validateResponse { response: HttpResponse ->
                val statusCode = response.status.value
                when (statusCode) {
                    in 300..399 -> throw RedirectResponseException(response)
                    in 400..499 -> throw ClientRequestException(response)
                    in 500..599 -> throw ServerResponseException(response)
                }

                if (statusCode >= 600) {
                    throw ResponseException(response)
                }
            }
        }

通过这样做,我能够通过我的自定义对象将错误传递回 UI

private suspend fun getCurrentWeatherForUrl(url:String, callback: (HttpResponseObject<MyObject>?) -> Unit){
        var response:HttpResponseObject<MyObject>? = null
        response = try{
            client.get<HttpResponseObject<MyObject>>(url){
                header("Authorization", "Bearer $authKey")
            }
        }catch (e:Exception){
            HttpResponseObject(null, e.toString())
        }

        callback(response)
    }

您还可以使用 HttpResponse.receive() 获取序列化对象和响应数据

val response:HttpResponse = client.get(url)
val myObject:MyObject = response.receive<MyObject>()