REST APIの設計と実装

Go言語における「REST APIの設計と実装」は、HTTPサーバーを基盤にして、リソースに対する操作(CRUD:Create, Read, Update, Delete)をHTTPメソッド(POST, GET, PUT, DELETE)にマッピングする形で構築されます。以下では、REST APIの設計思想から、Goによる具体的な実装例までを詳しく説明します。


1. REST APIの基本設計原則

リソース指向

  • すべてのデータ(例:ユーザー、記事など)を「リソース」として扱います。

  • リソースはURI(例:/users)で識別されます。

HTTPメソッドの使用

操作 メソッド URI例 説明
作成 POST /users ユーザーを新規作成
取得(一覧) GET /users ユーザー一覧を取得
取得(個別) GET /users/{id} 特定ユーザーを取得
更新 PUT /users/{id} 特定ユーザーを更新
削除 DELETE /users/{id} 特定ユーザーを削除

2. GoによるREST API実装のステップ

必要なパッケージ

go
import ( "encoding/json" "net/http" "strconv" "github.com/gorilla/mux" )

データ構造の定義

go
type User struct { ID int `json:"id"` Name string `json:"name"` } var users = []User{ {ID: 1, Name: "Alice"}, {ID: 2, Name: "Bob"}, }

ハンドラ関数の実装

一覧取得(GET /users)

go
func GetUsers(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(users) }

個別取得(GET /users/{id})

go
func GetUser(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id, _ := strconv.Atoi(params["id"]) for _, user := range users { if user.ID == id { json.NewEncoder(w).Encode(user) return } } http.NotFound(w, r) }

新規作成(POST /users)

go
func CreateUser(w http.ResponseWriter, r *http.Request) { var newUser User json.NewDecoder(r.Body).Decode(&newUser) newUser.ID = len(users) + 1 users = append(users, newUser) json.NewEncoder(w).Encode(newUser) }

更新(PUT /users/{id})

go
func UpdateUser(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id, _ := strconv.Atoi(params["id"]) for i, user := range users { if user.ID == id { json.NewDecoder(r.Body).Decode(&users[i]) users[i].ID = id json.NewEncoder(w).Encode(users[i]) return } } http.NotFound(w, r) }

削除(DELETE /users/{id})

go
func DeleteUser(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id, _ := strconv.Atoi(params["id"]) for i, user := range users { if user.ID == id { users = append(users[:i], users[i+1:]...) w.WriteHeader(http.StatusNoContent) return } } http.NotFound(w, r) }

3. ルーティングとサーバ起動

go
func main() { router := mux.NewRouter() router.HandleFunc("/users", GetUsers).Methods("GET") router.HandleFunc("/users/{id}", GetUser).Methods("GET") router.HandleFunc("/users", CreateUser).Methods("POST") router.HandleFunc("/users/{id}", UpdateUser).Methods("PUT") router.HandleFunc("/users/{id}", DeleteUser).Methods("DELETE") http.ListenAndServe(":8080", router) }

4. 補足事項

JSONのContent-Type設定

レスポンスの前に以下を追加すると適切なヘッダーになります:

go
w.Header().Set("Content-Type", "application/json")

バリデーション

  • リクエストボディの検証は省略されがちですが、現実のAPIでは入力検証が不可欠です。

  • github.com/go-playground/validator のようなライブラリを使うのが一般的です。

エラーハンドリング

  • 適切なステータスコード(400, 404, 500など)を返す設計が望まれます。


まとめ

GoによるREST APIの実装は、標準ライブラリと最小限の外部パッケージ(例えばgorilla/mux)でシンプルかつ高速に構築できます。RESTの設計原則に従ってルーティングを構成し、HTTPメソッドに基づくリソース操作を正確に実装することが、堅牢なAPIの基礎です。

必要であれば、認証(JWTなど)やミドルウェア、Swaggerドキュメントなどを組み込むことで、さらに実用的なREST APIに発展させることが可能です。

生成日:2025/05/03