iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Modern Web

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

請求參數驗證:資料對不對,先打個分數!

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250922/201788182pKnuiaHIa.jpg

寫程式就像開遊樂園大門口 🎡。
大家都想衝進去玩雲霄飛車,可是一定要有「保全大哥」檢查門票,才能確保進來的人符合規定。

在 Go 語言裡,我們的保全大哥就是—— go-playground/validator 套件 👮‍♂️。

為什麼要驗證?

想像一下,你做了一個「線上報名表單」,結果有人亂填:

名字:;;;;;

Email:我是小可愛

年齡:99999

這些奇怪資料如果直接塞進資料庫,會怎樣?
答:你的系統會亂成垃圾堆 🗑️,就像雜貨店被人拿來丟廚餘。

所以 驗證(Validation) 的任務,就是在「門口」先把這些怪東西擋掉,讓系統保持乾淨 ✨。

安裝 validator

只要在專案資料夾輸入:

go get github.com/go-playground/validator/v10

就能下載這個保全大哥上班啦 🚪👮。


基本使用

先來看最基本的「使用者註冊」規則:

Name 不能空白 ❌

Email 必須是真的 Email 格式 📧

程式碼:

package main

import (
	"net/http"
	"github.com/go-playground/validator/v10"
	"github.com/labstack/echo/v4"
)

type User struct {
	Name  string `json:"name" validate:"required"`
	Email string `json:"email" validate:"required,email"`
}

var validate = validator.New()

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

	e.POST("/register", func(c echo.Context) error {
		var user User
		if err := c.Bind(&user); err != nil {
			return c.JSON(http.StatusBadRequest, map[string]string{"error": "資料格式錯誤"})
		}

		// 驗證
		if err := validate.Struct(user); err != nil {
			return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Error()})
		}

		return c.JSON(http.StatusOK, map[string]string{"message": "註冊成功!"})
	})

	e.Logger.Fatal(e.Start(":8080"))
}

關鍵在這行:

validate.Struct(user)

它會幫你把 User struct 掃過一遍,違規就直接抓 🚨。

測試情境
情境一:名字空白

傳送:

{
  "name": "",
  "email": "test@gmail.com"
}

回傳:

{
  "error": "Key: 'User.Name' Error:Field validation for 'Name' failed on the 'required' tag"
}

保全大哥:名字不能空白啦! 🙅‍♂️

情境二:Email 格式錯誤

傳送:

{
  "name": "小明",
  "email": "not-an-email"
}

回傳:

{
  "error": "Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag"
}

保全大哥:這不是合法的 Email 格式 📛!

情境三:通過驗證

傳送:

{
  "name": "小明",
  "email": "xiaoming@gmail.com"
}

回傳:

{
  "message": "註冊成功!"
}

✅ 恭喜,這次大哥放你進來啦!


更多規則貼紙 🎟️

validator 規則超多,就像玩「貼紙遊戲」一樣,把規則貼在欄位上:

type Product struct {
	Name  string  `json:"name" validate:"required"`
	Price float64 `json:"price" validate:"gt=0"`
	Stock int     `json:"stock" validate:"min=1,max=100"`
}

規則解釋:

gt=0:價格必須大於 0 💰

min=1,max=100:庫存要在 1 到 100 之間 📦

測試:

{
  "name": "蘋果",
  "price": -10,
  "stock": 200
}

回傳:

{
  "error": "Key: 'Product.Price' Error:Field validation for 'Price' failed on the 'gt' tag\nKey: 'Product.Stock' Error:Field validation for 'Stock' failed on the 'max' tag"
}

保全大哥:

你不能自己倒貼 10 塊啦 💸!

庫存也太多了,你是要開水果倉庫嗎 🍎🏭?


自訂錯誤訊息 📝

預設錯誤訊息有點「工程師味」,一般人可能看不懂 🤯。
我們可以自己寫比較友善的訊息:

if err := validate.Struct(product); err != nil {
	for _, err := range err.(validator.ValidationErrors) {
		switch err.Tag() {
		case "required":
			return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Field() + " 是必填欄位"})
		case "gt":
			return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Field() + " 必須大於 0"})
		case "max":
			return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Field() + " 不能超過 100"})
		}
	}
}

這樣,錯誤就會更貼近人話,讓使用者秒懂 👌。

小結 🎯

到這裡,我們學到:

✅ 安裝並使用 validator

✅ 在 struct 欄位加規則貼紙

✅ 自動驗證請求資料

✅ 自訂錯誤訊息,讓回覆更人性化

簡單來說:validator 就像夜市的保全大哥,把亂七八糟的客人擋在門外,讓系統裡面乾淨安全 🛡️✨。


上一篇
Go 應用程式設定管理:12-Factor 原則的簡單版
系列文
Golang x Echo 30 天:零基礎GO , 後端入門8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言