iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Modern Web

Golang x Echo 30 天:零基礎GO , 後端入門系列 第 12

用 Go + Echo 打造你的第一個 TodoList , 第 2 篇:新增任務 API

  • 分享至 

  • xImage
  •  

歡迎回來!🙌 上一篇我們已經成功把伺服器跑起來,看到 Hello, TodoList!。那只是熱身,今天直接上主菜:讓伺服器真的能「新增一個待辦事項」

想像你對朋友說:

  • 「幫我記下:今天要寫數學作業。」
  • 朋友把它寫進筆記,本子從此就多了一條任務。

伺服器做的事也是這樣:接收你的請求 → 把資料記下來 → 以後可以查詢或管理。🗒️✅

你將完成什麼?
• 定義一個 Todo 的資料結構
• 用 slice(動態陣列)暫存任務
• 寫一支 POST /todos 的 API
• 用 curl 或 Postman 測試,看到「新增成功」🎉

步驟一:設計 Todo 資料結構
在 Go 裡,我們用 struct(結構體)來描述「一張待辦卡片」的樣子。

type Todo struct {
    ID    int    `json:"id"`    // 任務編號
    Title string `json:"title"` // 任務名稱,例如「寫數學作業」
    Done  bool   `json:"done"`  // 是否完成:true/false
}

小提醒:反引號裡的 json:"..." 叫做「標籤」,讓回傳的 JSON 欄位名稱更好看。

步驟二:準備一個暫存空間(先不接資料庫)
先別急著上資料庫,我們先用記憶體放著就好。等功能跑順再升級。🧪

var todos []Todo // 用來裝所有任務
var nextID = 1   // 自動編號,每新增一次就加一

步驟三:寫「新增任務」API(POST /todos)
我們要做一條路由:POST /todos。它會接收像這樣的 JSON:{"title": "寫數學作業"},幫你補上 IDDone=false,然後放進清單,最後把新增成功的任務回傳給你。

e.POST("/todos", func(c echo.Context) error {
    // 1) 解析請求中的 JSON
    var newTodo Todo
    if err := c.Bind(&newTodo); err != nil {
        return c.JSON(http.StatusBadRequest, map[string]string{
            "error": "invalid request",
        })
    }

    // 2) 自動加上 ID 與預設未完成
    newTodo.ID = nextID
    newTodo.Done = false
    nextID++

    // 3) 存進 slice
    todos = append(todos, newTodo)

    // 4) 回傳新增成功的任務
    return c.JSON(http.StatusOK, newTodo)
})

📌 這段程式在做什麼:

  1. 接球:把你送來的 JSON(例如 {"title":"寫數學作業"})接起來。
  2. 補齊:自動幫你加上 IDDone=false
  3. 收納:丟進 todos 清單。
  4. 回答:回傳完整任務,告訴你「新增成功!」。

步驟四:實際測試 API

  1. 先啟動你的程式:
go run main.go
  1. curl 測試(或用 Postman 也行):
curl -X POST http://localhost:1323/todos   -H "Content-Type: application/json"   -d '{"title":"寫數學作業"}'

你應該會收到回覆(數字可能不同):

{
  "id": 1,
  "title": "寫數學作業",
  "done": false
}

再新增一筆:

curl -X POST http://localhost:1323/todos   -H "Content-Type: application/json"   -d '{"title":"倒垃圾"}'

回覆:

{
  "id": 2,
  "title": "倒垃圾",
  "done": false
}

🎉 成功!任務一個個加入清單啦。

完整 main.go(可直接貼上執行)

package main

import (
	"net/http"

	"github.com/labstack/echo/v4"
)

type Todo struct {
	ID    int    `json:"id"`
	Title string `json:"title"`
	Done  bool   `json:"done"`
}

var todos []Todo
var nextID = 1

func main() {
	e := echo.New()

	// 健康檢查 / 問候路由
	e.GET("/hello", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, TodoList!")
	})

	// 新增任務:POST /todos
	e.POST("/todos", func(c echo.Context) error {
		var newTodo Todo
		if err := c.Bind(&newTodo); err != nil {
			return c.JSON(http.StatusBadRequest, map[string]string{
				"error": "invalid request",
			})
		}

		newTodo.ID = nextID
		newTodo.Done = false
		nextID++

		todos = append(todos, newTodo)

		return c.JSON(http.StatusOK, newTodo)
	})

	// 伺服器啟動
	e.Logger.Fatal(e.Start(":1323"))
}

小結
今天我們完成了 TodoList 的第一個超重要功能:新增任務。你已經完成:
• ✍️ 定義 Todo 結構
• 🧺 用 slice 暫存所有任務
• 🚪 做出 POST /todos API
• 🔎 用 curl / Postman 測試新增多筆任務
就像在記事本上寫下第一條待辦,我們的 TodoList 正式活起來了!🔥

下一步(預告)
接著我們要做:查詢所有任務(GET /todos)。沒有清單畫面只能一直新增,看不到內容,感覺就像「寫了日記卻翻不到書頁」。下一篇帶你把清單完整列出,一起把 TodoList 越做越像樣!📋✨

想先暖身?你可以試著自己加一條 GET /todos 路由,回傳 todos 陣列。


上一篇
用 Go + Echo 打造你的第一個 TodoList , 第 1 篇:專案初始化
系列文
Golang x Echo 30 天:零基礎GO , 後端入門12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言