GoでREST APIを作る——net/httpとルーティングの基本
Go標準ライブラリの net/http を中心に、JSON APIの実装・ミドルウェアの組み込み・エラーハンドリングの基本を解説します。
はじめに
GoのREST APIは標準ライブラリだけでも十分に実用的です。本記事では net/http(Go 1.22以降の強化されたルーター)を使い、シンプルなユーザーCRUD APIを実装しながら、エラーハンドリングとミドルウェアの基本を押さえます。
プロジェクトのセットアップ
| |
ディレクトリ構成:
go-api/
├── main.go
├── handler/
│ └── user.go
├── middleware/
│ └── logging.go
└── model/
└── user.go
モデルの定義
| |
ハンドラーの実装
Go 1.22からパスパラメータ({id})が標準ルーターで使えるようになりました。
| |
ルーティングとサーバー起動
| |
Go 1.22では "GET /users" のようにHTTPメソッドをパターンに含められます。以前のバージョンと異なり、GETとPOSTを同じパスで別々のハンドラーに振り分けられます。
ロギングミドルウェア
| |
http.ResponseWriter をラップしてステータスコードをキャプチャするのが定石です。標準の ResponseWriter はステータスコードを後から取り出せないため、このラッパーが必要になります。
動作確認
| |
次のステップ
この構成をベースにしてよく追加されるのは以下の要素です。
| 要素 | 手段 |
|---|---|
| DB接続 | database/sql + pgx |
| バリデーション | go-playground/validator |
| 認証 | JWT + Bearerトークン |
| 設定管理 | os.Getenv または spf13/viper |
| テスト | httptest.NewRecorder でハンドラー単体テスト |
まとめ
Go 1.22以降の標準ルーターはメソッドとパスパラメータに対応しており、シンプルなAPIであればサードパーティのルーターなしで実装できます。ミドルウェアは http.Handler を受け取って http.Handler を返す関数として実装するのが慣例です。エラーレスポンスは writeError のようなヘルパーに集約しておくと一貫したフォーマットを保てます。