コース一覧
    Go実践:並行処理とWeb API
    つくる: API主要部完成

    Go実践:並行処理とWeb API

    Goの並行処理とWeb API開発を組み合わせ、実践的なサービス構築へ進むコースです。

    1
    ゴルーチンと並行処理のさわり
    01. ゴルーチン15分
    02. チャネル20分
    03. 待ち合わせ20分
    04. 並行の落とし穴20分
    05. つくる: 並行集計20分
    06. 第7章クイズ10分
    2
    Web API(net/http)
    01. サーバーを立てる20分
    02. ハンドラ関数20分
    03. JSONを返す20分
    04. ルーティング20分
    05. 一覧API20分
    06. 詳細APIと40420分
    07. 出品API20分
    08. つくる: API主要部完成25分
    09. 第8章クイズ10分
    3
    総合制作
    01. 仕様互換を仕上げる25分
    02. Node版と差し替える25分
    03. 1バイナリでデプロイ25分
    04. 自由拡張25分
    05. 完成と次のステップ20分

    つくる: API主要部完成

    エンドポイント一式を1つの mux に

    第8章の内容を全部使います。新しい知識はありません。

    プレーンテキスト

    ServeMux      パスで振り分ける
    メソッド判定  GET と POST を分ける
    JSON          構造体タグで返す
    クエリ        検索で絞り込む
    パス          ID を取り出す
    ステータス    200 / 201 / 400 / 404

    ここまで1本ずつ作ってきたものを、1つのサーバーにまとめます。

    プレーンテキスト

    GET  /items          一覧(keyword で絞り込み)
    GET  /items/{id}     詳細(無ければ404)
    POST /items          出品(検証して201)

    応答の形を揃える

    1つの API の中で、成功もエラーも同じ形にします。

    プレーンテキスト

    成功    データそのもの
    エラー  {"error":"理由"}

    エラーのときだけ形が変わると、使う側が毎回確かめることになります。第8章で何度か触れた話です。

    エラーを返す処理が3か所以上出てくるので、関数に切り出すと読みやすくなります。

    Go

    func writeError(w http.ResponseWriter, code int, message string) {
    	w.WriteHeader(code)
    	w.Write([]byte(fmt.Sprintf(`{"error":%q}`, message)))
    }

    第4章でやった「同じ処理が2回以上出てきたら切り出す」の判断です。

    ステータスコードの割り当て

    プレーンテキスト

    GET /items          200
    GET /items/1        200
    GET /items/99       404  存在しない
    GET /items/abc      400  IDの形が違う
    POST /items 正常     201  作った
    POST /items 検証NG   400  送られた内容がおかしい

    404 と 400 の使い分けが要点です。「そのIDのものが無い」のか「そもそもリクエストの書き方が違う」のかで分けます。

    メソッドで分ける

    /items は GET と POST の両方を受けます。1つのハンドラの中で分けるか、Go 1.22 の記法で別々に登録するか、どちらでも構いません。

    Go

    mux.HandleFunc("GET /items", listHandler)
    mux.HandleFunc("POST /items", createHandler)

    別々に登録するほうが、1つ1つのハンドラが短くなります。

    順番に作る

    プレーンテキスト

    1. GET /items だけを通す
    2. GET /items/{id} を足す
    3. 404 と 400 を分ける
    4. POST /items を足す
    5. エラーの形を揃える

    1段ごとにテストを流してください。全部書いてから直すと、どこで崩れたのか分からなくなります。

    要件

    1. GET /items はクエリ keyword で絞り込む。0件でも [] を返す
    2. GET /items/{id} は数値でなければ 400、無ければ 404
    3. POST /items は検証を通れば 201、通らなければ 400
    4. エラーの本文は {"error":"理由"} の形に揃える

    ヒント

    `writeError` は用意してあります。エラーを返すところは全部これを使ってください

    `detailHandler` では、まず `strconv.Atoi` で 400 を判定し、見つからなければ最後に 404 を返します

    出品成功のテストで `id` が 0 になっているのは、送られてこなかったフィールドがゼロ値になるためです

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/10

    関連レッスン

    • 第8章クイズ

      net/http、ハンドラ、JSON、ルーティング、ステータスコードについての理解を確認します。

    • 仕様互換を仕上げる

      ステータスコードとエラー形式を仕様に揃え、互換のあるAPIとして仕上げられるようになります。

    • 出品API

      POSTのボディを読んで検証し、不正なら400を返して登録できるようになります。

    • 詳細APIと404

      パスからIDを取り出して1件返し、見つからないときに404を返せるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
    • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
    • APIアプリ間でデータをやり取りする窓口
    • 処理計算や代入を表す長方形
    • 関数処理に名前を付けて再利用できる単位
    • 判断YES/NO 分岐を表す菱形
    • ステータスコード200/201/404 など結果を示す3桁の数値
    • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
    main.go
    エディタを読み込んでいます

    メモ

    つくる: API主要部完成

    ⌘S で保存