VIDEO LESSON
ReactのAPI GET処理:fetchJsonでJSON取得とエラーを共通化するの解説動画
再生時間 7:36動画を別のタブで開く ↗
動画の字幕・文字起こしを読む
再生中の字幕を濃い黒で表示し、一番上に追従します。字幕の行を選ぶと、その位置から再生できます。
- 0:00こんにちは。
- 0:00リアクト入門の第十回です。
- 0:02今回は、エーピーアイのゲット処理を、フェッチジェイソンという独自の関数にまとめ、
- 0:07ジェイソン取得とエラー処理を共通化する方法を学びます。
- 0:12サーバーからデータを取得する処理は、取得先が変わっても、送る、応答を確認する、
- 0:17ジェイソンとして読み取る、という手順は毎回ほぼ同じです。
- 0:22その共通部分を部品にできれば、画面のコードは取得したデータをどう表示するかに集中できます。
- 0:28前回は状態を持つ処理をカスタムフックにしましたが、今回は状態を持たない通信の部品化です。
- 0:34その違いも意識しながら進めましょう。
- 0:37まず、フェッチジェイソンの位置づけです。
- 0:40これはリアクトの組み込みエーピーアイではなく、自分で作る非同期関数です。
- 0:45内部でフックを使わないため、コンポーネント以外からも呼び出せます。
- 0:50通信の共通手順だけを担当し、読み込み中かどうかや、結果を保持するステートは、
- 0:54呼び出し側のコンポーネントが担当します。
- 0:58役割を分けることで、通信の直し方は一か所に、画面ごとの表示の違いはそれぞれの画面に、
- 1:03と変更の影響範囲がはっきりします。
- 1:07ユーアールエルからジェイソンを取得する、という小さな契約を守る関数として作っていきます。
- 1:13画面ごとに通信コードを書き写すと、直し漏れや書き方のばらつきが起きやすくなります。
- 1:19共通化は、その事故を防ぐための工夫でもあります。
- 1:23通信の失敗は、一種類ではありません。
- 1:26段階ごとに分けて考えます。
- 1:28まず、ネットワーク自体の失敗です。
- 1:30接続できない場合は、フェッチが例外を投げます。
- 1:34次に、エイチティーティーピーのエラーです。
- 1:37ここが大切な注意点で、フェッチはステータスが四〇四や五〇〇でも、通常はレスポンスを返してしまいます。
- 1:45成功したかどうかは、レスポンスのオッケーという値で自分で判定しなければなりません。
- 1:51最後に、応答は届いたのに中身がジェイソンとして読めない、解析の失敗です。
- 1:57この三つを区別すると、どこで何が起きたのかを、利用者への案内や調査に活かせます。
- 2:03実装を見ます。
- 2:04ファイルは、エスアールシー配下のエーピーアイフォルダーに、フェッチジェイソン・ティーエスとして置きます。
- 2:11引数は、取得先のユーアールエルと、任意の中止通知シグナルです。
- 2:16フェッチにはゲットメソッドと、ジェイソンを受け取ることを示すアクセプトヘッダーを渡します。
- 2:22応答が返ったら、オッケーが偽のときだけ、エイチティーティーピーとステータス番号を含むエラーを投げます。
- 2:30問題なければ、レスポンスのジェイソンメソッドの結果をそのまま返します。
- 2:35十数行ですが、成功判定と解析までを一つの入口に集約できています。
- 2:40戻り値の型にも意味があります。
- 2:42プロミス・アンノウン、つまり中身が分からない値として返すのです。
- 2:47エーピーアイから届いた内容は、受け取るまでは未検証です。
- 2:51最初から決まった型だと決めつけてしまうと、実際の内容が違っても、コード上は正しいものとして扱われてしまいます。
- 3:00アンノウンにしておけば、使う前に確かめる作業が必須になります。
- 3:05また、この関数の対象はジェイソンを返す取得先だけです。
- 3:09ステータス二〇四のような空の応答や、ファイルの取得は、別の契約として分けて実装してください。
- 3:16対象を絞ることで、利用者も迷いません。
- 3:19この関数はジェイソン取得専用だと、名前と型から読み取れる形にしておきましょう。
- 3:25最小の実行例では、外部のエーピーアイを使いません。
- 3:28バイトなどの開発環境では、パブリックフォルダーに置いたファイルが、サイトのルートからそのまま配信されます。
- 3:36そこに、メッセージという項目を一つだけ持つジェイソンファイルを用意します。
- 3:41パスは、パブリック配下のエーピーアイフォルダーに、メッセージ・ジェイソンです。
- 3:47これで、アカウント登録も外部サービスへの通信もなしに、ゲット処理の成功と失敗の両方を手元で練習できます。
- 3:54まずは動く最小例で流れをつかみ、後から本物のエーピーアイへ切り替える進め方です。
- 4:00画面側のアプリ・ティーエスエックスを見ます。
- 4:03保持するステートは、メッセージ、エラー、読み込み中の三つです。
- 4:08ボタンを押すとハンドルロードが動き、最初に読み込み中を真にして、前の結果とエラーを消します。
- 4:15次にフェッチジェイソンでデータを取り、メッセージが文字列かどうかを検証してから、
- 4:19表示用のステートに入れます。
- 4:23何か失敗したらキャッチでエラーメッセージを入れ、最後はファイナリーで読み込み中を必ず解除します。
- 4:30通信の細部は関数の中にあり、画面側は状態の遷移と表示だけを追えば読める形です。
- 4:35ボタンは読み込み中は無効化され、文言も読み込み中に切り替わります。
- 4:40エラーはアラートとして、結果はライブリージョンとして伝わるよう、属性も状態と連動させています。
- 4:47検証の条件を一つずつ読みます。
- 4:49データがオブジェクトであること、ヌルではないこと、メッセージというキーがあること、
- 4:54その値が文字列であること。
- 4:58この四つをすべて満たさない場合は、形式が不正だというエラーを投げます。
- 5:03たとえば記事の確認手順にあるように、ジェイソン側のメッセージを数値に変えると、
- 5:08通信自体は成功しても、この検証でエラーになります。
- 5:13型はあくまでコード上の約束であり、外部から届いた内容の正しさまでは保証しません。
- 5:19境界で確かめる習慣が、想定外のデータから画面を守ります。
- 5:23動作確認では、成功だけでなく失敗も試します。
- 5:27ジェイソンファイルの名前を変えれば、取得先が見つからず失敗します。
- 5:32メッセージを数値に変えれば、形式エラーになります。
- 5:35ただし注意点が一つあります。
- 5:37開発サーバーによっては、存在しないユーアールエルへ、エイチティーエムエルをステータス二〇〇で返してしまう場合があります。
- 5:46見た目だけでは四〇四なのか解析失敗なのか区別できないため、確認するときはブラウザーのネットワークパネルで、
- 5:52実際の応答とステータスもあわせて見てください。
- 5:57今回、こうした成功、エイチティーティーピーエラー、解析失敗などの分岐をモックで実行し、
- 6:02記事の期待と一致することを確認しました。
- 6:07エラーメッセージが段階ごとに違う文言になることも、切り分けができている証拠として確認してください。
- 6:14本物のエーピーアイへ切り替えるときの注意です。
- 6:18別オリジンのエーピーアイには、サーバー側のシーオーアールエス、クロスオリジン許可が必要です。
- 6:25モードにノーシーオーアールエスを付けても、読めるジェイソンにはなりません。
- 6:31また、機密のエーピーアイキーをブラウザー側に置いてはいけません。
- 6:36必要なら、認証と権限確認を行うサーバーを経由します。
- 6:40中止については、アボートコントローラーのシグナルを渡せば通信を取り消せます。
- 6:46ただし、画面切り替え時の競合処理は次回のユースエーピーアイデータで扱います。
- 6:52この例自体は、キャッシュや自動の再試行は提供しません。
- 6:56まとめです。
- 6:57取得先ごとに繰り返す、成功判定、ジェイソン解析、エイチティーティーピーエラーの整形は、
- 7:02フェッチジェイソンに集約します。
- 7:06届いたデータの検証と、読み込み中やエラーといった状態の管理は、呼び出し側が担当します。
- 7:13この分担が、今回の要点です。
- 7:15一方、ブラウザー上でボタンを押して表示を確認する作業は、実行環境の制約で未実施です。
- 7:21気になる方は、手元のバイト環境で記事のファイルを用意して試してみてください。
- 7:27次回は、通信状態の管理をまとめるカスタムフック、ユースエーピーアイデータを学びます。
- 7:34お疲れさまでした。
この動画で学べること
fetchでJSONを取得する独自関数を作り、HTTPエラー、JSON解析失敗、AbortSignal、取得データの検証を整理します。
解説記事・サンプルコードを読む:ReactのAPI GET処理:fetchJsonでJSON取得とエラーを共通化する →