Go言語学習19日目:リクエストに応じて動的にJSONを返すAPIを作ってみた。。エラーハンドリングも意識!

Go言語学習19日目

Go言語学習もついに19日目に突入! 今日は昨日に引き続き、JSONレスポンスの強化にチャレンジしました。

目標はズバリ!

クライアントのリクエスト内容に応じて、動的なJSONを返すAPIを作る!


具体的にやったこと

  • クエリパラメータからユーザー名を取得
  • 取得した名前に応じてJSONレスポンスを生成
  • 無効なリクエストには適切なエラーJSONを返す

サンプル:ユーザー情報を返すAPIを作成

エンドポイント

GET http://localhost:8080/api/user?name=たろう


実装コード
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type User struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email"`
}

var users = map[string]User{
    "たろう": {"たろう", 30, "taro@example.com"},
    "はなこ": {"はなこ", 25, "hanako@example.com"},
}

func userHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    name := r.URL.Query().Get("name")
    if name == "" {
        http.Error(w, `{"error":"nameパラメータが必要です"}`, http.StatusBadRequest)
        return
    }

    user, ok := users[name]
    if !ok {
        http.Error(w, `{"error":"ユーザーが見つかりません"}`, http.StatusNotFound)
        return
    }

    json.NewEncoder(w).Encode(user)
}

func main() {
    http.HandleFunc("/api/user", userHandler)
    fmt.Println("サーバー起動:http://localhost:8080/api/user?name=たろう")
    http.ListenAndServe(":8080", nil)
}

動作確認!

1️⃣ 正常リクエスト
curl http://localhost:8080/api/user?name=たろう
{"name":"たろう","age":30,"email":"taro@example.com"}

2️⃣ nameパラメータなし
curl http://localhost:8080/api/user
{"error":"nameパラメータが必要です"}

3️⃣ 存在しないユーザー
curl http://localhost:8080/api/user?name=じろう
{"error":"ユーザーが見つかりません"}

今日の学びポイント

✅ 動的にJSONを返すAPIのコツ
  • クエリパラメータで入力を受け取る
  • データが存在するか確認(マップ活用)
  • エラー時は http.Error を使って適切なJSON+ステータスコードを返す
  • 正常時は json.NewEncoder(w).Encode(...) でスムーズにレスポンス!

今日のまとめ

Go言語19日目の総括
  • クエリパラメータを使って動的にJSONレスポンスを返すAPIを実装
  • 無効なリクエストにはエラーJSON+HTTPステータスを返す設計を学んだ
  • Goの標準ライブラリだけで、実用的なAPIの基礎が作れると実感!