メインコンテンツまでスキップ

HTTP API通信で発生するエラーのハンドリング

HTTP APIは、HTTPステータスコードを使用して処理の成功と失敗を表します。

HTTPステータスコード意味
2xx成功
4xxクライアントサイドに起因するエラー
5xxサーバサイドに起因するエラー

HTTPステータスコードが4xxの場合は、モバイルアプリの操作によって解決が可能なエラーになります。HTTPステータスコードが5xxの場合は、モバイルアプリの操作では解決できないエラーとなります。

HTTPステータスコードが4xxのエラーハンドリング

以下のHTTPステータスコードが返却された場合、ユーザにエラーの内容と解消のための適切な手順を伝えます。ここに含まれないHTTPステータスコードの場合は、想定外のエラーが発生したことをスナックバーに表示します。

HTTPステータスコード意味
400BadRequest - リクエストとして送るペイロードがバリデーションエラーになった場合など
401Unauthorized - セッションの有効期限が切れた場合
403Forbidden - 有効な利用規約に同意していない場合
404Not found - リソースが見つからなかった場合
412Precondition Failed - 操作しているモバイルアプリケーションが強制アップデート対象の場合
429Too 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ステータスコード意味
503Service Unavailable - HTTP APIがシステムメンテナンスで止まっている場合
504Gateway 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のリクエストとして送信する場合は、エラー発生前の状態を保持する