#概要
APIでErrorで返された時に、errorBodyの中の情報を用いて挙動を変える必要があった時の備忘録
##環境
Kotlin
Retrofit2
Rxjava2
okhttp3
Gson
CompositeDisposable
を利用
##注意点
###・ResponseのオブジェクトをResponseで囲む
@Get("/hoge")
fun getHoge(): Single<HogeResponse>
ompositeDisposable.add(hogeViewModel.getHogeData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ //it:HogeResponse
}, {//it:Throwable!
}))
okHttp3のIntercepterを利用したりすればどうにかできるかもしれないけど、これだとerrorBodyが得られなかったので以下のようにした
@Get("/hoge")
fun getHoge(): Single<Response<HogeResponse>>
ompositeDisposable.add(hogeViewModel.getHogeData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ //it:Response<HogeResponse>
if (it.isSuccessful) {
} else {
val errorResponse = Gson().fromJson<ErrorResponse>(it.errorBoey()?.toString(), ErrorResponse::class.java)
}
}, {//it:Throwable!
}))
errorBodyは取得できたが、jsonをパースするのに失敗
###・errorBody?.toString → errorBody?.string()
jsonのStringを得るにはtoStringじゃなくてstring()だったというだけの話
errorBody?.toString() =>"okhttp3.ResponseBody$1@f0875b5"
errorBody?.string() => {"error":{"message":"Not Found", "error":{"status":404}}}
ompositeDisposable.add(hogeViewModel.getHogeData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ //it:Response<HogeResponse>
if (it.isSuccessful) {
} else {
val errorResponse = Gson().fromJson<ErrorResponse>(it.errorBody()?.string(), ErrorResponse::class.java)
}
}, {//it:Throwable!
}))
data class ErrorResponse(
@SerializedName("message")
var message: String,
@SerializedName("error")
var error: Error
)
API関連はライブラリに頼りっぱなしになっていたので、いま一度詳細を確認しておきたいと思ってから時間ばかりがすぎる今日この頃...orz