Как получить код статуса HttpCall с сериализацией Ktor и kotlinx - PullRequest
6 голосов
/ 04 мая 2020

Я пытаюсь выяснить, как проверить код состояния http HTTP-запроса с помощью Ktor

У меня есть простой запрос GET, подобный этому, с HttpResponseObject, который содержит данные, возвращаемые сервером, и любые ошибки на стороне сервера, которые я контролирую

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

Теперь мне также нужно проверить, есть ли необработанные исключения или исключения аутентификации, которые генерируются сервером. В этих случаях сервер ничего не вернет, и будет возвращен код состояния 500 или 401 ошибка.

Я вижу, что в документации вы можете получить полный HTTP-ответ примерно так

val response:HttpResponse client.get(url)

, но тогда как потерять возвращаемые сериализованные данные, и я не смог найти никаких примеров того, как сериализуйте его из объекта HttpResponse.

Есть ли у кого-нибудь предложения? есть ли способ получить код состояния http из моего первого примера?

Ответы [ 2 ]

0 голосов
/ 12 мая 2020

В итоге я использовал HttpResponseValidator в HttpClientConfig, чтобы поймать коды состояния, а затем выбросить исключения

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

Таким образом, я смог передать ошибку через свой собственный резервное копирование объекта в пользовательский интерфейс

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>()
0 голосов
/ 07 мая 2020

Вы можете попробовать получить код состояния, используя следующий код: val response = client.get<HttpResponse>(url) после этого, чтобы получить байты из ответа и сериализовать его, вы можете попробовать использовать val bytes: ByteArray = response.readBytes()

Вы можете найти полную документацию здесь: https://ktor.io/clients/http-client/quick-start/responses.html

...