10-5. 演習問題
実アプリ側でも確認するときは、
book-app/book-frontend/でnpx --yes serve . --listen 4173を実行して起動し、http://localhost:4173/を開く。終わったらCtrl + Cで停止する。
問題1:選択問題
Section titled “問題1:選択問題”1-1. fetch() が返す値として最も適切なのはどれか。
- A. Promise
- B. CSS クラス
- C. HTML テーブル
解答と解説
正解:A. Promise
- A が正しい。
fetch()は非同期処理なので Promise を返す。 - B は誤り。CSS クラスは返さない。
- C は誤り。HTML テーブルも返さない。
そのため await や .then() で結果を待つ必要がある。
1-2. 新しい本をサーバーへ追加するときに最も適切な HTTP メソッドはどれか。
- A.
POST - B.
GET - C.
DELETE
解答と解説
正解:A. POST
- A が正しい。新規作成は
POSTが代表的である。 - B は誤り。
GETは取得用であり、データ変更を目的としない。 - C は誤り。
DELETEは削除用である。
HTTP メソッドは「何をしたいか」を表す言葉でもある。
1-3. response.ok を確認する主な理由として最も適切なのはどれか。
- A. HTTP 的に成功かどうかを判断するため
- B. CSS が読み込まれたかを確認するため
- C. 表示中のフォントを確認するため
解答と解説
正解:A. HTTP 的に成功かどうかを判断するため
- A が正しい。400 や 500 は通信自体は返ってきても業務的には失敗である。
- B は誤り。CSS 読み込み確認には使わない。
- C は誤り。フォント確認とも無関係である。
fetch() はエラー時も必ず catch に入るわけではないため、ok を見る必要がある。
1-4. 削除 API が 204 No Content を返したときの扱いとして最も適切なのはどれか。
- A. 本文が空でも成功として扱い、無理に JSON を読まない
- B. 必ず
response.json()を呼ばないと失敗になる - C.
PATCHと同じ扱いにする
解答と解説
正解:A. 本文が空でも成功として扱い、無理に JSON を読まない
- A が正しい。204 は「成功だが本文なし」を意味することが多い。
- B は誤り。本文がないのに
json()を呼ぶと逆にエラー要因になる。 - C は誤り。
PATCHとDELETEは役割もレスポンスも違うことがある。
API ごとの仕様を見ることは大切だが、204 では本文なしの可能性を常に意識したい。
1-5. 通信成功・失敗に関係なく最後にローディングを解除したいとき、最も向いているのはどれか。
- A.
finally - B.
break - C.
continue
解答と解説
正解:A. finally
- A が正しい。成功でも失敗でも最後に必ず通る。
- B と C はループ制御であり、非同期通信の後始末には向かない。
ローディング解除の書き忘れを防ぐためにも finally は重要である。
1-6. Network タブで「送った JSON 本文」を確認したいとき、主に見る場所として最も適切なのはどれか。
- A. Payload
- B. Elements
- C. Rendering
解答と解説
正解:A. Payload
- A が正しい。送信本文は Payload で確認できる。
- B は誤り。Elements は DOM 構造を見る場所である。
- C は誤り。Rendering は描画系の確認に使う。
「送ったつもり」の内容と「実際に送られた JSON」は違うことがあるため、Payload を見る習慣が大切である。
問題2:穴埋め問題
Section titled “問題2:穴埋め問題”次の文章の空欄を埋めてください。
fetch()の待ち時間を上から順に読みやすく書くためによく使う構文はasync/ ( ) である。- 一覧取得に使う代表的な HTTP メソッドは ( ) である。
- 新規作成に使う代表的な HTTP メソッドは ( ) である。
- 一部更新に使う代表的な HTTP メソッドは ( ) である。
- 削除に使う代表的な HTTP メソッドは ( ) である。
- 実際に飛んだ通信の URL・Method・Status を確認する主要な場所は DevTools の ( ) タブである。
解答と解説
- await
- GET
- POST
- PATCH
- DELETE
- Network
awaitを使うと Promise の完了を待ちながら順番に読める。- GET / POST / PATCH / DELETE は REST API の基本的な操作を表す。
- Network タブは実際に飛んだ通信を確認する最重要ポイントである。
これらの単語は暗記ではなく、「どの操作に対応しているか」を結び付けて覚えることが重要である。
問題3:記述問題
Section titled “問題3:記述問題”3-1. 10-3 のブラウザ内 state 版と比べて、10-5 で API 連携が必要になる理由を説明してください。
解答と解説
3-1. 例
ブラウザ内 state 版はその場の画面更新には向いているが、別端末や別利用者と共有することはできない。API 連携があると、サーバー側でデータを一元管理でき、複数環境から同じデータを見たり、検索・認可・監査のような処理も追加しやすくなる。つまり API は「保存場所をブラウザの外へ広げる」ために必要である。
3-2. ローディング表示とエラー表示を用意しておくことが、なぜ利用者と開発者の両方にとって重要なのか説明してください。
解答と解説
3-2. 例
ローディング表示があると利用者は「いま処理中だ」と分かり、同じボタンの連打を減らしやすい。エラー表示があると、失敗したことと次に見るべき内容が分かる。開発者にとっても、どの操作でどんな失敗が起きたかを画面上で再現しやすく、Console や Network と合わせて原因を調べやすくなる。
3-3. response.ok を確認しないと、どのような勘違いが起きやすいか説明してください。
解答と解説
3-3. 例
response.ok を確認しないと、HTTP 400 や 500 でも「値は返ってきた」と誤解して成功扱いしやすい。その結果、本来は失敗なのに state を更新したり、エラーメッセージを出さずに処理を進めてしまったりする。API 連携では「通信できた」ことと「業務的に成功した」ことを分けて考える必要がある。
3-4. API 呼び出しで 400 エラーが返ったとき、Network タブを使って何を確認するか説明してください。
解答と解説
3-4. 例
まず該当リクエストを Network タブで開き、Method と Status が想定通りか確認する。次に Headers で URL が正しいか、Payload で送った JSON に title や price が入っているかを見る。そのうえで Response や Preview に表示されるエラーメッセージを読み、送信値の不足なのか、型の間違いなのか、API パスの誤りなのかを切り分ける。
問題4:ハンズオン
Section titled “問題4:ハンズオン”プレイグラウンドで、fetch に似た動きをする fakeFetch を使って通信の流れを確認してみましょう。
このプレイグラウンドでは本物のネットワーク通信は行わないため、Network タブには出ません。
その代わり、Console に Method / URL / loading / 結果 を順番に表示します。
ここでは、TODO を 1 つ埋めるたびに実行し、どの HTTP 操作が増えたかを順番に観察します。
実アプリで確認するときは、同じ順番で script.js を保存 → ブラウザ更新 → Network 確認を行ってください。
取り組む内容
Section titled “取り組む内容”TODO 1を埋めて実行し、GET /api/booksと初期冊数だけが出ることを確認する- ここで止まり、実アプリでもページ更新直後の
GET /api/booksを Network で確認する TODO 2を埋めて実行し、POST /api/booksと追加タイトルが出ることを確認する- ここで止まり、実アプリでもフォーム送信による
POST /api/booksと一覧追加を確認する TODO 3を埋めて実行し、PATCH /api/books/b3と更新後ステータスが出ることを確認する- ここで止まり、実アプリでも状態変更による
PATCH /api/books/{id}を確認する TODO 4を埋めて実行し、DELETE /api/books/b3と削除後冊数が出ることを確認する- ここで止まり、実アプリでも削除による
DELETE /api/books/{id}を確認する TODO 5を埋めて実行し、最後にエラー文言が出ることを確認する- 最後に実アプリでも不正入力のエラー表示と失敗レスポンスを確認する
method: "PATCH"を"PUT"に変えて再実行し、想定外メソッドの扱いを観察する
確認したいポイント
Section titled “確認したいポイント”setLoading(true/false)がtry/finallyで必ず対になっていることを確認する- TODO 5 の
tryはcatchも持つ — エラー時は catch を通ってから finally が動くことを確認する requestJSON内でresponse.okを確認しないと 400 エラーが成功扱いになる理由を理解する
実アプリで同じ順番に確認するなら
Section titled “実アプリで同じ順番に確認するなら”- まず
GET /api/booksが自動で飛ぶことを Network で見る - 次にフォーム送信で
POST /api/booksが201になることを確認する - その次に状態変更で
PATCH /api/books/{id}が200になることを確認する - 続いて削除で
DELETE /api/books/{id}が204になることを確認する - 最後に不正入力でエラー表示と失敗レスポンスを確認する
期待する出力例
Section titled “期待する出力例”loading: trueHTTP GET /api/books初期冊数: 2loading: falseloading: trueHTTP POST /api/books追加タイトル: CSS設計の基本loading: falseloading: trueHTTP PATCH /api/books/b3更新後ステータス: 読了loading: falseloading: trueHTTP DELETE /api/books/b3削除後冊数: 2loading: falseloading: trueHTTP POST /api/books最後のエラー: title is requiredloading: false解答と解説
このハンズオンで確認したいこと
- GET で一覧を読む
- POST で 1 冊追加する
- PATCH で状態を更新する
- DELETE で削除する
- エラー時にも
finallyで loading を戻す
出力の読み方
HTTP GET /api/booksの直後に初期冊数: 2が出る → 一覧取得成功HTTP POST /api/booksの直後に追加タイトル: CSS設計の基本が出る → 新規作成成功HTTP PATCH /api/books/b3の直後に更新後ステータス: 読了が出る → 一部更新成功HTTP DELETE /api/books/b3の直後に削除後冊数: 2が出る → 削除後の状態が反映された- 最後の
HTTP POST /api/booksで最後のエラー: title is requiredが出る →response.ok判定とエラー処理が効いている
response.ok 判定を消すと何が起きるか
400 エラーのレスポンスでも成功データのように扱ってしまい、失敗を正しく表現できなくなる。API 連携では非常に危険な状態である。
実アプリでの確認ポイント
プレイグラウンドは fakeFetch なので Network タブには出ないが、実アプリでは同じ順番で GET / POST / PATCH / DELETE が並ぶはずである。Network タブでその順番と Payload / Response を見比べると、フロントエンドの処理と実通信の対応が理解しやすくなる。