Go项目实战:构建一个RESTful API

在现代Web开发中,RESTful API是构建微服务和前后端分离架构的核心。Go语言以其高效的性能和简洁的语法,非常适合用于构建高性能的RESTful API。在本篇文章中,我们将通过一个实战项目,构建一个简单的任务管理API,涵盖用户可以创建、读取、更新和删除任务(CRUD操作)。

项目规划:需求分析

我们的任务管理API需要支持以下功能:

  1. 创建任务:用户可以提交一个任务,包含任务名称和描述。

  2. 读取任务:用户可以获取所有任务的列表,也可以获取单个任务的详细信息。

  3. 更新任务:用户可以更新任务的状态或内容。

  4. 删除任务:用户可以删除一个任务。

环境准备
  1. 安装Go环境。

  2. 初始化项目模块:

    bash复制

    mkdir task-manager
    cd task-manager
    go mod init task-manager
  3. 安装必要的依赖,如gorilla/mux(用于路由)和log库:

    bash复制

    go get github.com/gorilla/mux
    go get github.com/sirupsen/logrus
代码实现
  1. 定义任务结构体

    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"`
    }
  2. 实现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))
    }
  3. 运行项目

    bash复制

    go run main.go

    现在,你可以使用curl或Postman测试API接口。

测试API接口
  1. 创建任务

    bash复制

    curl -X POST -H "Content-Type: application/json" -d '{"title":"Task 1","description":"Description 1"}' http://localhost:8080/tasks
  2. 获取所有任务

    bash复制

    curl http://localhost:8080/tasks
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值