Go言語で簡単なWebサービスを作るための手順を説明します。この例では、net/http
パッケージを使用して基本的なRESTful APIを作成します。APIは、メモリ内に保存される単純なタスク管理システムを提供します。
ステップ 1: プロジェクトのセットアップ
- Goのインストールを確認します。ターミナルで以下を実行し、Goがインストールされているかを確認します。shコードをコピーする
go version
- 新しいプロジェクトディレクトリを作成します。shコードをコピーする
mkdir go-web-service cd go-web-service
- 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の構築方法を示しています。複雑なアプリケーションでは、データベースや他のフレームワークを統合することが考えられますが、この例は基本的な構成を理解するのに役立ちます。
コメント