問10 総合 リプレイス完遂
師範 / 目安 45分
凛さんが、めずらしく手を止めてこちらを見ました。
「最終ミッションです。fleama API 仕様書のうち、一覧・詳細・出品の3エンドポイント——Node版と完全互換の Go 実装を。互換テストが全部緑になったら、本番を切り替えます」
少し間があって、続けます。
「……fleama の心臓を、あなたに預けます」
ここまでの9問が、そのまま道具になります。
| 使うもの | どの問で |
|---|---|
error を受け止める | 問2 |
switch で分ける | 問4 |
| スライスを育てる | 問5 |
| 構造体とコンストラクタ | 問7 |
| 構造体タグと JSON | 問9 |
仕様書(抜粋)
| メソッドとパス | 応答 | ステータス |
|---|---|---|
GET /items | 商品一覧の配列 | 200 |
GET /items/:id | 商品1件 | 200 |
GET /items/:id(無い id) | {"error":"商品が見つかりません"} | 404 |
POST /items | 作られた商品 | 201 |
POST /items(検証で落ちる) | {"error":"<理由>"} | 400 |
JSON のキーは id name price です。エラーの形は {"error":"..."} で統一します。
検証は問7の NewItem に任せてください。名前が空なら 商品名は必須です、価格が 0 以下なら 価格は1円以上です です。
完成条件
handleRequest を作ってください。メソッド・パス・出品する商品名・価格を受け取り、ステータス|本文 の形で返します。
プレーンテキスト
200|[{"id":1,"name":"レザースニーカー","price":4800}]
404|{"error":"商品が見つかりません"}
201|{"id":3,"name":"木製のスツール","price":3500}
400|{"error":"商品名は必須です"}初期の在庫は id が 1 と 2 の2件です。出品したときの id は、いまある最大の id に 1 を足します。
知らないパスが来たときは 404|{"error":"見つかりません"} を返してください。
要件
GET /itemsは一覧を 200 で、GET /items/1は1件を 200 で返す(無い id は 404 で商品が見つかりません)POST /itemsは検証を通れば 201 で作られた商品を返し、通らなければ 400 で理由を返す- 知らないパスは
404|{"error":"見つかりません"}を返す
入出力例
handleRequest("GET", "/items", "", 0) → "200|[{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}]"
handleRequest("GET", "/items/2", "", 0) → "200|{"id":2,"name":"古着のデニムジャケット","price":6200}"
handleRequest("GET", "/items/999", "", 0) → "404|{"error":"商品が見つかりません"}"
handleRequest("GET", "/items/abc", "", 0) → "404|{"error":"商品が見つかりません"}"
handleRequest("POST", "/items", "木製のスツール", 3500) → "201|{"id":3,"name":"木製のスツール","price":3500}"
handleRequest("POST", "/items", "", 3500) → "400|{"error":"商品名は必須です"}"
handleRequest("POST", "/items", "木製のスツール", 0) → "400|{"error":"価格は1円以上です"}"
handleRequest("GET", "/users", "", 0) → "404|{"error":"見つかりません"}"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部