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ステータスコードを取得する方法はありますか?
私がやったことは、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)
}
}
}
_
そうすることで、カスタムオブジェクトを介してエラーを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>()
_