Go言語学習21日目:Web API開発の流れを総復習!ゼロからGETリクエストAPIを再実装してみた

Go言語学習記録21日目

Go言語学習もいよいよ3週目の最終日=21日目に突入しました!

今日はこの1週間で学んできた「Web API開発」について、
しっかり振り返りながら、ゼロからもう一度書いてみる実践チャレンジに取り組みました。

今まではコチラ

kunio-ud-all.com


🔁 総復習:GoのWeb API開発フローまとめ

Web APIを作る基本ステップ(これまでに学んだこと)
  1. net/http を使ってサーバーを立てる
  2. http.HandleFunc でルーティングを設定
  3. r.URL.Query() でクエリパラメータを取得
  4. encoding/json で構造体 → JSON変換
  5. http.Errorw.WriteHeader を使って適切なレスポンスコードを返す

この流れがしっかり頭に入っていれば、GoでAPIを自力で作る準備は万端!かな?


チャレンジ:ゼロからGET APIを実装

今回作ったのは、「ユーザー名を指定してメッセージを返すAPI」。
GET /api/greet?name=たろう のような形でアクセスすると、JSONでメッセージが返るシンプルなAPIです。


実装コード

package main

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

type GreetResponse struct {
    Message string `json:"message"`
}

func greetHandler(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
    }

    msg := fmt.Sprintf("こんにちは、%sさん!", name)
    res := GreetResponse{Message: msg}

    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(res)
}

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

確認手順
go run main.go

ブラウザ or curl でアクセス:

curl http://localhost:8080/api/greet?name=はなこ

結果(正常時)
{
  "message": "こんにちは、はなこさん!"
}

結果(エラー時)
{"error":"nameパラメータを指定してください"}

何回も同じ風なのを書いて覚えたいです。。


POSTでJSONを受け取るサンプル(名前を登録)

type UserRequest struct {
    Name string `json:"name"`
}

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

    if r.Method != http.MethodPost {
        http.Error(w, `{"error":"POSTメソッドでアクセスしてください"}`, http.StatusMethodNotAllowed)
        return
    }

    var req UserRequest
    err := json.NewDecoder(r.Body).Decode(&req)
    if err != nil || req.Name == "" {
        http.Error(w, `{"error":"nameが必要です"}`, http.StatusBadRequest)
        return
    }

    res := GreetResponse{Message: fmt.Sprintf("%sさんを登録しました!", req.Name)}
    json.NewEncoder(w).Encode(res)
}
http.HandleFunc("/api/register", postHandler)

今日のまとめ

✅ Go言語21日目の総まとめ
  • 1週間で学んだAPI開発の流れを整理しなおせた
  • net/httpencoding/json でAPI開発の基本をマスター
  • ルーティング・クエリ・ステータスコードなど実務に必要な要素を習得
  • POSTにも挑戦して、より実践的な感覚がつかめた!

以上となります。引き続きよろしくお願いいたします。