一覧API
コレクションを返す
1件を返すのと、一覧を返すのは形が違います。
プレーンテキスト
1件 {"name":"きのこ図鑑","price":1200}
一覧 [{"name":"きのこ図鑑",...},{"name":"中古スマホ",...}]スライスを Marshal すれば、そのまま配列になります。
Go
items := []Item{...}
b, _ := json.Marshal(items)0件のときが問題になる
第5章のスライスのゼロ値を思い出してください。nil です。
Go
var items []Item // nil
b, _ := json.Marshal(items)
string(b) // "null"空の配列 [] ではなく null になります。
受け取る側にとって、これは困ります。
JavaScript
const items = await res.json()
items.length // null だとエラーになる0件でも [] を返すには、空のスライスを明示的に作ります。
Go
items := []Item{} // nil ではない空スライス
b, _ := json.Marshal(items)
string(b) // "[]"var items []Item と items := []Item{} は、JSON にしたときだけ違いが出ます。len はどちらも 0 で、append もどちらもできるので、普段は同じように扱えます。
API を書くときは []Item{} から始める、と覚えておくと事故が減ります。
絞り込みを足す
プレーンテキスト
GET /items?keyword=きのこ前のレッスンでやったクエリパラメータの読み取りと、第6章の絞り込みを組み合わせます。
Go
keyword := r.URL.Query().Get("keyword")
result := []Item{}
for _, item := range all {
if keyword == "" || item.Name == keyword {
result = append(result, item)
}
}keyword が空なら全件、という条件は第6章の Matches メソッドと同じ形です。
件数を返すこともある
一覧だけを返す形と、件数を添える形があります。
プレーンテキスト
配列そのまま [{...},{...}]
包む形 {"total":2,"items":[{...},{...}]}包む形は、総件数やページ情報を一緒に返したいときに使います。ページ送りのある一覧では、こちらが必要になります。
どちらが正しいということはありません。 ただし1つの API の中では揃えてください。エンドポイントごとに形が違うと、使う側が毎回確かめることになります。
要件
- クエリパラメータ
keywordで絞り込む keywordが空なら全件を返す- 商品名の完全一致で判定する
- 該当0件のときは
nullではなく[]を返す
入出力例
callList("") → "[{"name":"きのこ図鑑","price":1200},{"name":"中古スマホ","price":24800}]"
callList("keyword=中古スマホ") → "[{"name":"中古スマホ","price":24800}]"
callList("keyword=謎の箱") → "[]"ヒント
編集 ゆめさく編集部