背景
今回は、任意のAPIをサーバに対して叩いた際に特定のHTTPステータスコードが返ってきた場合の実装方法を考えてみました。活用例としては、「アップデートしてね」表示やサーバメンテナンス画面の表示などだと思います。
※例として、「アップデートしてね」表示を行うことを想定します。
流れ
モバイル側でやることは以下のようになると思います。
- 任意のAPIを叩く
- レスポンスのHTTPステータスコードを取得し、特定のHTTPステータスコードであったら、それに応じた処理を行う
肝になるのは言うまでもないですが、2ですね。それぞれに関して説明します。
レスポンスのHTTPステータスコードを取得する
こちらの記事で記載されているように、subscribe()メソッドで特定の登録しているHTTPステータスコードかを判別する方法もありますが、この場合APIを追加するたびにhasError()メソッドを忘れずに記載する必要が出てきます。
忘れずにということはなかなか難しいと思いますので、どこか1つのみに記載して、毎回勝手に確認を行ってほしいものです…。
そこで、以下のようにしました。
val builder = OkHttpClient.Builder().addInterceptor {
val originalRequest: Request = it.request()
val url = originalRequest.url().newBuilder()
.build()
val request = originalRequest.newBuilder().url(url).build()
val response: okhttp3.Response = it.proceed(request)
// HTTPステータスコードの処理
ApiSpecificErrorEvent.publish(response.code())
response
}
OkHttpClient.Builder()addInterceptor {...} 内でresponse.code()によって、HTTPステータスコードを取得して、特定の処理をさせるようにしました。
これによってAPIを追加するたびに処理を記載する必要はなく、一箇所のみに記載知ることで特定のHTTPステータスコードを扱う処理を行うことができました。
※最後は特定のServiceクラスにpub/subによってeventを飛ばして特定の処理をさせています。
最後に
ただ、こちらはメインスレッドではなくRxJavaの通信スレッドで行われていました…。
UIに対して操作するには適していない可能性が大ですのでもしどなたかいい案がございましたら教えてください…。
参考記事
Retrofitを使ったAPI呼び出しでリカバリ可能なHTTPエラーをどう扱うか問題
https://qiita.com/FumihikoSHIROYAMA/items/65d52aea1a9f324d347e
Retrofitを使ったOAuth再認証アプローチ
https://qiita.com/FumihikoSHIROYAMA/items/ac1beaeaa9b4baaed939
Retrofit 2 — Catch Server Errors Globally with Response Interceptor
https://futurestud.io/tutorials/retrofit-2-catch-server-errors-globally-with-response-interceptor