Go言語で学ぶREST API入門 [初学者向け]

## はじめに

REST APIは、Webアプリケーションやモバイルアプリケーションが、サーバーとデータをやり取りするための仕組みです。  
Go言語は、そのシンプルさと高速性から、REST APIを効率的に構築するのに非常に適している言語です。

本記事では、REST APIの基本概念からGoを使った実装方法まで、初心者向けにわかりやすく解説します。

### **対象読者**
- そもそもREST APIが何かよく分からない方
- Go言語でWeb APIを作成してみたい方
- シンプルなAPIサーバーを構築したい方

### **目次**
1. そもそもREST APIとは？
   - RESTの基本概念
   - HTTPメソッドの種類
   - RESTfulなAPIの特徴
2. Go言語でのREST API実装
   - 必要なパッケージのインストール
   - ハンドラ関数の作成
   - ルーティングの設定
3. 実践：GoでシンプルなREST APIを作成
   - メモリ内にデータを保存する簡易API
   - CRUD操作（Create, Read, Update, Delete）の実装
4. Postmanを使った動作確認

---

## 1. そもそもREST APIとは？

**1.1 REST の基本概念**
- **REST (REpresentational State Transfer)** は、Web 上でデータをやり取りするための設計スタイルのこと。
- **クライアント - サーバーモデル** に基づき、クライアントがリクエストを送り、サーバーがレスポンスを返す。
- **ステートレス (Stateless)** な設計で、各リクエストはそれぞれ独立している。

**1.2 HTTP メソッドの種類**
REST APIでは、以下のHTTPメソッドを使って、データの操作を行います。

| メソッド | 説明                           | 使用例               |
|----------|--------------------------------|----------------------|
| **GET**  | データの取得                    | `GET /users`          |
| **POST** | データの新規作成                | `POST /users`         |
| **PUT**  | データの更新（完全置き換え）    | `PUT /users/{id}`     |
| **PATCH**| データの部分更新                | `PATCH /users/{id}`   |
| **DELETE**| データの削除                   | `DELETE /users/{id}`  |

**1.3 RESTfulなAPIの特徴**
- **リソース指向のURL設計**：データの種類をURLで表現する。
  - 例: `/users`（ユーザー一覧）、`/users/{id}`（特定のユーザー）
- **HTTPメソッドの適切な使用**：CRUD操作をHTTPメソッドに対応させる。
- **ステートレスな通信**：リクエストごとに認証情報を送信する。

---

## 2. Go言語でのREST API実装

Go言語では、**net/httpパッケージ** を使ってREST API を構築できますが、Ginフレームワークを使うと、よりシンプルで高速な実装が可能です。

**2.1 必要なパッケージのインストール**
以下のコマンドで、Ginフレームワークをインストールします。

```sh
go get -u github.com/gin-gonic/gin
```

**2.2 ハンドラ関数の作成**
- **ハンドラ関数**とは、各エンドポイントに対するリクエストを処理する関数です。
- 例：`GET /users` リクエストに対して、ユーザー一覧を返すハンドラを作成。

```go
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

var users = []User{
    {ID: 1, Name: "John"},
    {ID: 2, Name: "Jane"},
}

func getUsers(c *gin.Context) {
    c.JSON(http.StatusOK, users)
}
```

**2.3 ルーティングの設定**
- ルーティングとは、**URLとハンドラ関数を紐付けること**です。
- Ginでは、`GET`, `POST`, `PUT`, `DELETE`メソッドに対応したルーティングが簡単に設定できます。

```go
func main() {
    router := gin.Default()
    router.GET("/users", getUsers)  // ユーザー一覧の取得
    router.Run(":8080")  // ポート 8080 で起動
}
```

---

## 3. 実践：Go でシンプルな REST API を作成

**3.1 メモリ内にデータを保存する簡易 API**
- サーバー起動中はメモリ内にデータを保存し、CRUD操作を実現します。
- **CRUD操作**とは、Create（作成）、Read（取得）、Update（更新）、Delete（削除）のことです。

**3.2 CRUD 操作の実装**
以下のエンドポイントを実装します。
- `GET /users`：ユーザー一覧の取得
- `POST /users`：新しいユーザーの作成
- `GET /users/:id`：特定のユーザーの取得
- `PUT /users/:id`：ユーザー情報の更新
- `DELETE /users/:id`：ユーザーの削除

**main.go**
```go
// POST /users のハンドラ
func createUser(c *gin.Context) {
    var newUser User
    if err := c.ShouldBindJSON(&newUser); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    newUser.ID = len(users) + 1
    users = append(users, newUser)
    c.JSON(http.StatusCreated, newUser)
}

// ルーティングの設定
func main() {
    router := gin.Default()
    router.GET("/users", getUsers)
    router.POST("/users", createUser)  // 新しいユーザーの作成
    router.Run(":8080")
}
```

---

## 4. Postman を使った動作確認
- Postmanを使うことで、APIの動作確認が簡単に行えます。
- `GET`, `POST`, `PUT`, `DELETE` の各メソッドを使用して、エンドポイントをテスト。

1. **GET /users** を実行して、ユーザー一覧を取得する。
2. **POST /users** を実行して、新しいユーザーを作成する。

---

## まとめ

| 項目 | 説明 |
|------|------|
| **REST API** | Webアプリケーションがサーバーと通信するための仕組み |
| **HTTPメソッド** | GET, POST, PUT, DELETEを使ったCRUD操作 |
| **Ginフレームワーク** | シンプルかつ高速なREST APIをGoで構築できる |

REST APIの基本からGoを使った実装までを簡単に解説しました。  
アプリケーション開発やそもそものプログラムに慣れるための練習としてREST APIを作ってみることはいい勉強になります。
切実にGoを極めていきたい！