GoでHTTPサーバーを構築して複数のAPIエンドポイントを作成する方法



この記事では、Goの標準ライブラリ `net/http` を使って、簡単なHTTPサーバーを立ち上げ、複数のAPIエンドポイントを作成する手順を解説します。これにより、ブラウザやHTTPクライアントからリクエストを受け取り、JSONデータやレスポンスを返すAPIサーバーを構築できます。

## 必要な準備

1. Goがインストールされていること（バージョン1.16以上推奨）
   - インストールされていない場合は、公式サイトからインストールします：[Go公式サイト](https://golang.org/dl/)
2. ターミナル（またはコマンドプロンプト）

## サーバーコードの実装

以下のコードを使って、複数のAPIエンドポイントを持つサーバーを作成します。

```go
package main

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

// User 構造体
type User struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

// "/api/hello" エンドポイント
func helloHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, API!!")  // テキストメッセージを返す
}

// "/api/user" エンドポイント
func userHandler(w http.ResponseWriter, r *http.Request) {
	user := User{
		ID:   1,
		Name: "John Doe",
		Age:  30,
	}
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(user)  // JSONでユーザー情報を返す
}

// "/api/data" エンドポイント (POST)
func dataHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
		return
	}

	var data map[string]interface{}
	err := json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(data)  // 受け取ったデータをそのままJSONで返す
}

// メイン関数
func main() {
	// ハンドラ関数を指定してエンドポイントを作成
	http.HandleFunc("/api/hello", helloHandler)
	http.HandleFunc("/api/user", userHandler)
	http.HandleFunc("/api/data", dataHandler)

	// サーバー起動
	fmt.Println("Starting server at :8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("Error:", err)
	}
}
```

### コードの解説

1. **`helloHandler` 関数**:
   - `/api/hello` エンドポイントにアクセスすると、シンプルなテキストメッセージ "Hello, API!!" を返します。
   
2. **`userHandler` 関数**:
   - `/api/user` エンドポイントにアクセスすると、`User` 構造体のJSONデータを返します。このデータには、ユーザーのID、名前、年齢が含まれています。

3. **`dataHandler` 関数**:
   - `/api/data` エンドポイントでは、`POST` メソッドで送信されたJSONデータを受け取り、そのデータをそのままJSONで返します。

4. **`http.ListenAndServe`**:
   - サーバーはポート `8080` で起動します。エラーが発生した場合、コンソールにエラーメッセージが表示されます。

## 実行手順

1. Goのプロジェクトディレクトリを作成し、その中に上記のコードを `main.go` というファイル名で保存します。

2. ターミナルを開き、プロジェクトディレクトリに移動します。

3. 以下のコマンドを実行してサーバーを起動します。

   ```bash
   go run main.go
   ```

4. サーバーが起動すると、ターミナルに以下のメッセージが表示されます。

   ```bash
   Starting server at :8080
   ```

5. ブラウザや`curl`を使用してAPIにアクセスできます。

### APIの利用例

#### 1. `/api/hello` エンドポイント

ブラウザまたはターミナルで次のURLにアクセスします。

```bash
curl http://localhost:8080/api/hello
```

**レスポンス**:
```
Hello, API!!
```

#### 2. `/api/user` エンドポイント

ユーザー情報を取得するには、次のURLにアクセスします。

```bash
curl http://localhost:8080/api/user
```

**レスポンス** (JSON形式):
```json
{
    "id": 1,
    "name": "John Doe",
    "age": 30
}
```

#### 3. `/api/data` エンドポイント

`POST` メソッドでデータを送信し、そのデータを返してもらうには、以下のコマンドを実行します。

```bash
curl -X POST -H "Content-Type: application/json" -d '{"message": "Hello, World!"}' http://localhost:8080/api/data
```

**レスポンス** (JSON形式):
```json
{
    "message": "Hello, World!"
}
```

## まとめ

この記事では、Goの `net/http` パッケージを使用して、複数のAPIエンドポイントを持つ簡単なHTTPサーバーを実装する方法を紹介しました。Goの標準ライブラリだけで、シンプルで効率的なサーバーを構築できるのは大きな魅力です。

これで、基本的なAPIサーバーをGoで実装するための基礎を理解できたと思います。今後は、より複雑な機能を追加して、実際のプロジェクトにも適用してみてください。