HTTP API通信で発生するエラーのハンドリング
HTTP APIは、HTTPステータスコードを使用して処理の成功と失敗を表します。
HTTPステータスコード | 意味 |
---|---|
2xx | 成功 |
4xx | クライアントサイドに起因するエラー |
5xx | サーバサイドに起因するエラー |
HTTPステータスコードが4xxの場合は、モバイルアプリの操作によって解決が可能なエラーになります。HTTPステータスコードが5xxの場合は、モバイルアプリの操作では解決できないエラーとなります。
HTTPステータスコードが4xxのエラーハンドリング
以下のHTTPステータスコードが返却された場合、ユーザにエラーの内容と解消のための適切な手順を伝えます。ここに含まれないHTTPステータスコードの場合は、想定外のエラーが発生したことをスナックバーに表示します。
HTTPステータスコード | 意味 |
---|---|
400 | BadRequest - リクエストとして送るペイロードがバリデーションエラーになった場合など |
401 | Unauthorized - セッションの有効期限が切れた場合 |
403 | Forbidden - 有効な利用規約に同意していない場合 |
404 | Not found - リソースが見つからなかった場合 |
412 | Precondition Failed - 操作しているモバイルアプリケーションが強制アップデート対象の場合 |
429 | Too Many Requests - クライアントから大量のリクエストが送信された場合 |
4xxのHTTPステータスコードが返却された場合、SantokuAppの動作は以下のようになります。
HTTPステータスコード | SantokuAppの動作 |
---|---|
400 | デフォルトの動作では、特に処理を実施しません。SantokuAppではクライアントバリデーションを実施するため基本的には発生しない想定です。クライアントでは実施できないバリデーションなどがある機能に関しては、個別にエラー処理を実施してください。 |
401 | デフォルトの動作では、自動ログイン機能を利用して新しいセッションIDを再取得します。セッションIDを取得後、HTTP API通信をリトライします。 |
403 | デフォルトの動作では、最新の利用規約をFormSheetで表示し、ユーザに同意を求めます。ユーザが同意後、元の画面に戻ります。 |
404 | デフォルトの動作では、特に処理を実施しません。あるユーザがアクセスしようとしている情報が、他のユーザに削除されてしまった場合などに発生する可能性があります。そういったユースケースが存在する機能に関しては、個別にエラー処理を実施してください。 |
412 | デフォルトの動作では、アプリを新しいバージョンにアップデートするように促すダイアログを表示します。アプリを新しいバージョンにアップデートするまでは常にこのダイアログが表示され、ユーザは他の操作をできません。 |
429 | デフォルトの動作では、時間をおいてから再操作をするように促すスナックバーを表示します。 |
その他 | デフォルトの動作では、想定外のエラーが発生したことを伝えるスナックバーを表示します。また、エラー内容をFirebase Crashlyticsに送信します。 |
HTTPステータスコードが5xxのエラーハンドリング
以下のHTTPステータスコードが返却された場合、HTTP APIから返却されるメッセージをユーザに伝えます。ここに含まれないHTTPステータスコードの場合は、想定外のエラーが発生したことをスナックバーに表示します。
HTTPステータスコード | 意味 |
---|---|
503 | Service Unavailable - HTTP APIがシステムメンテナンスで止まっている場合 |
504 | Gateway Timeout - HTTP APIから時間内に応答がなかった場合 |
5xxのHTTPステータスコードが返却された場合、SantokuAppの動作は以下のようになります。
HTTPステータスコード | SantokuAppの動作 |
---|---|
503 | デフォルトの動作では、システムメンテナンス中であることを伝えるスナックバーを表示します。 |
504 | デフォルトの動作では、時間をおいてから再操作をするように促すスナックバーを表示します。 |
その他 | デフォルトの動作では、想定外のエラーが発生したことを伝えるスナックバーを表示します。また、エラー内容をFirebase Crashlyticsに送信します。 |
HTTP APIからレスポンスが返却されない場合のエラーハンドリング
HTTP APIからレスポンスが返却されない場合は、以下のような原因が考えられます。
- 端末のネットワークがOFFになっている
- HTTP APIとの通信中にネットワークが切断された
- 接続先サーバのポートにアクセスできない
これらの場合は、ネットワークの状態を確認してもらうか、時間をおいてから再操作をするように促すスナックバーを表示します。
HTTP API通信のタイムアウト
HTTP APIとの通信が1分以上経過した場合、通信を強制的にキャンセルします。この場合は、ネットワークの状態を確認してもらうか、時間をおいてから再操作をするように促すスナックバーを表示します。
SantokuAppのHTTP APIクライアントとして利用するaxiosでは、timeoutを設定できます。axiosのtimeout
は、Androidではコネクションタイムアウトのみに使用されるため、コネクション接続後にサーバの応答が遅い場合などはタイムアウトしません。
そのため、SantokuAppではaxiosのtimeout
を使用せず、CancelTokenを利用してHTTP API通信をキャンセルすることによりタイムアウトを実現しています。
エラー発生時に表示するメッセージ
HTTP API通信時にエラーが発生した場合は、レスポンスに含まれているエラーコードに応じたメッセージをダイアログ、またはスナックバーで表示します。エラーコードがレスポンスに含まれていない場合は、SantokuAppで定義したデフォルトのメッセージを表示します。
HTTP API通信のリトライ
SantokuAppのデフォルト動作ではリトライ処理を実施しません。ユーザ自身が再試行の判断をする方が利用しやすいと考えたためです。
以下に記載している方法で、各画面毎にユーザがHTTP APIを再試行可能なUI / UXを提供するようにしてください。
- リソースを取得する場合は、Pull-to-refreshなど、ユーザ操作で再取得を試みることができるUIを配置する
- リソースの登録や更新、削除を再試行できるように、非活性にしていたボタンなどを活性化させる
- エラーメッセージを表示するスナックバーに、再試行可能なUIを配置する
- 入力値をHTTP APIのリクエストとして送信する場合は、エラー発生前の状態を保持する