web-dev-qa-db-ja.com

Ktorおよびkotlinxシリアル化を使用してHttpCallのステータスコードを取得する方法

Ktorを使用してhttpリクエストのhttpステータスコードを確認する方法を理解しようとしています

サーバーが返すデータとサーバー側で制御するエラーを保持するHttpResponseObjectを使用した、このような単純なGETリクエストがあります。

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

ここで確認する必要があるのは、サーバーによってスローされる未処理の例外または認証例外があるかどうかです。これらの場合、サーバーからは何も返されず、ステータスコード500または401のエラーが返されます。

私はドキュメントがこのようなもので完全なhttp応答を得ることができると思います

val response:HttpResponse client.get(url)

しかし、どのようにして戻ってくるシリアル化されたデータを失うのか、そしてHttpResponseオブジェクトからそれをシリアル化する方法の例を見つけることができませんでした。

誰か提案はありますか?最初の例からhttpステータスコードを取得する方法はありますか?

6
tyczj

私がやったことは、HttpResponseValidatorHttpClientConfigを使用してステータスコードをキャッチし、例外をスローすることでした。

_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>()
_
0
tyczj