在现代Web开发中,RESTful API是构建微服务和前后端分离架构的核心。Go语言以其高效的性能和简洁的语法,非常适合用于构建高性能的RESTful API。在本篇文章中,我们将通过一个实战项目,构建一个简单的任务管理API,涵盖用户可以创建、读取、更新和删除任务(CRUD操作)。
项目规划:需求分析
我们的任务管理API需要支持以下功能:
-
创建任务:用户可以提交一个任务,包含任务名称和描述。
-
读取任务:用户可以获取所有任务的列表,也可以获取单个任务的详细信息。
-
更新任务:用户可以更新任务的状态或内容。
-
删除任务:用户可以删除一个任务。
环境准备
-
安装Go环境。
-
初始化项目模块:
bash复制
mkdir task-manager cd task-manager go mod init task-manager -
安装必要的依赖,如
gorilla/mux(用于路由)和log库:bash复制
go get github.com/gorilla/mux go get github.com/sirupsen/logrus
代码实现
-
定义任务结构体:
go复制
package main import "time" type Task struct { ID string `json:"id"` Title string `json:"title"` Description string `json:"description"` CreatedAt time.Time `json:"created_at"` } -
实现API接口:
go复制
package main import ( "encoding/json" "log" "net/http" "time" "github.com/gorilla/mux" "github.com/sirupsen/logrus" ) var tasks = make(map[string]Task) var nextID = 1 func createTask(w http.ResponseWriter, r *http.Request) { var task Task if err := json.NewDecoder(r.Body).Decode(&task); err != nil { logrus.Error("Failed to decode request body:", err) http.Error(w, "Invalid request body", http.StatusBadRequest) return } task.ID = strconv.Itoa(nextID) task.CreatedAt = time.Now() tasks[task.ID] = task nextID++ w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(task) } func getTasks(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(tasks) } func getTask(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) taskID := vars["id"] task, ok := tasks[taskID] if !ok { http.Error(w, "Task not found", http.StatusNotFound) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(task) } func updateTask(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) taskID := vars["id"] var updatedTask Task if err := json.NewDecoder(r.Body).Decode(&updatedTask); err != nil { logrus.Error("Failed to decode request body:", err) http.Error(w, "Invalid request body", http.StatusBadRequest) return } task, ok := tasks[taskID] if !ok { http.Error(w, "Task not found", http.StatusNotFound) return } task.Title = updatedTask.Title task.Description = updatedTask.Description tasks[taskID] = task w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(task) } func deleteTask(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) taskID := vars["id"] _, ok := tasks[taskID] if !ok { http.Error(w, "Task not found", http.StatusNotFound) return } delete(tasks, taskID) w.WriteHeader(http.StatusNoContent) } func main() { router := mux.NewRouter() router.HandleFunc("/tasks", createTask).Methods("POST") router.HandleFunc("/tasks", getTasks).Methods("GET") router.HandleFunc("/tasks/{id}", getTask).Methods("GET") router.HandleFunc("/tasks/{id}", updateTask).Methods("PUT") router.HandleFunc("/tasks/{id}", deleteTask).Methods("DELETE") log.Println("Server started at :8080") log.Fatal(http.ListenAndServe(":8080", router)) } -
运行项目:
bash复制
go run main.go现在,你可以使用
curl或Postman测试API接口。
测试API接口
-
创建任务:
bash复制
curl -X POST -H "Content-Type: application/json" -d '{"title":"Task 1","description":"Description 1"}' http://localhost:8080/tasks -
获取所有任务:
bash复制
curl http://localhost:8080/tasks

835

被折叠的 条评论
为什么被折叠?



