Go言語で作るWebサービス

WordPress

Go言語で簡単なWebサービスを作るための手順を説明します。この例では、net/httpパッケージを使用して基本的なRESTful APIを作成します。APIは、メモリ内に保存される単純なタスク管理システムを提供します。

ステップ 1: プロジェクトのセットアップ

  1. Goのインストールを確認します。ターミナルで以下を実行し、Goがインストールされているかを確認します。shコードをコピーするgo version
  2. 新しいプロジェクトディレクトリを作成します。shコードをコピーするmkdir go-web-service cd go-web-service
  3. Goモジュールを初期化します。shコードをコピーするgo mod init go-web-service

ステップ 2: 必要なパッケージのインポート

main.goファイルを作成し、以下のコードを追加します。

package main

import (
"encoding/json"
"log"
"net/http"
"strconv"
"sync"
)

var (
tasks = make(map[int]string)
nextTaskID = 1
mu sync.Mutex
)

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

func main() {
http.HandleFunc("/tasks", handleTasks)
http.HandleFunc("/tasks/", handleTask)
log.Println("Server is running on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleTasks(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
mu.Lock()
defer mu.Unlock()
tasksList := make([]Task, 0, len(tasks))
for id, name := range tasks {
tasksList = append(tasksList, Task{ID: id, Name: name})
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(tasksList)
case http.MethodPost:
var task Task
if err := json.NewDecoder(r.Body).Decode(&task); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
mu.Lock()
task.ID = nextTaskID
nextTaskID++
tasks[task.ID] = task.Name
mu.Unlock()
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(task)
default:
w.WriteHeader(http.StatusMethodNotAllowed)
}
}

func handleTask(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Path[len("/tasks/"):])
if err != nil {
http.Error(w, "Invalid task ID", http.StatusBadRequest)
return
}
mu.Lock()
defer mu.Unlock()
switch r.Method {
case http.MethodGet:
name, exists := tasks[id]
if !exists {
http.Error(w, "Task not found", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(Task{ID: id, Name: name})
case http.MethodDelete:
if _, exists := tasks[id]; !exists {
http.Error(w, "Task not found", http.StatusNotFound)
return
}
delete(tasks, id)
w.WriteHeader(http.StatusNoContent)
default:
w.WriteHeader(http.StatusMethodNotAllowed)
}
}

ステップ 3: サーバーの実行

プロジェクトディレクトリで以下のコマンドを実行してサーバーを起動します。

go run main.go

サーバーはポート8080でリクエストを待ち受けます。

ステップ 4: APIのテスト

以下のようにcurlコマンドを使ってAPIをテストできます。

タスクの作成

curl -X POST -H "Content-Type: application/json" -d '{"name": "Buy groceries"}' http://localhost:8080/tasks

全タスクの取得

curl http://localhost:8080/tasks

特定のタスクの取得

curl http://localhost:8080/tasks/1

タスクの削除

curl -X DELETE http://localhost:8080/tasks/1

説明

  • handleTasks関数は、全タスクの取得(GETリクエスト)と新しいタスクの作成(POSTリクエスト)を処理します。
  • handleTask関数は、特定のタスクの取得(GETリクエスト)と削除(DELETEリクエスト)を処理します。
  • タスクは、シンプルなメモリ内のマップ(map[int]string)として保存されます。

この基本的なWebサービスは、Goのnet/httpパッケージを使って、RESTful APIの構築方法を示しています。複雑なアプリケーションでは、データベースや他のフレームワークを統合することが考えられますが、この例は基本的な構成を理解するのに役立ちます。

コメント

タイトルとURLをコピーしました