Validasi Input User di Aplikasi Web dengan Gin dan Go
Kalau bikin aplikasi web, salah satu hal penting yang sering disepelekan adalah validasi input. Tanpa validasi, data yang nyasar atau asal-asalan bisa langsung masuk ke sistem—dan ujung-ujungnya bikin masalah.
Di tulisan ini, saya bikin contoh sederhana bagaimana melakukan validasi input user (misalnya form pendaftaran) dengan framework Gin di Go, plus bantuan paket populer go-playground/validator
.
Struktur Proyek
Struktur foldernya sederhana:
project/
│
├── main.go
└── utils/
└── validation.go
1. Setup Aplikasi Gin
Bikin file main.go
buat handle request. kita bikin endpoint /register
yang terima data JSON, lalu dicek dulu sebelum diproses.
package main
import (
"net/http"
"website/utils/validation"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// User: data yang bakal divalidasi
type User struct {
Name string `json:"name" validate:"required,min=3"`
Email string `json:"email" validate:"required,email"`
Password string `json:"password" validate:"required,min=6"`
}
func main() {
r := gin.Default()
r.POST("/register", registerHandler)
r.Run(":8080")
}
func registerHandler(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"})
return
}
validate := validator.New()
validationErrors := validation.ValidateStruct(validate, user)
if len(validationErrors) > 0 {
c.JSON(http.StatusUnprocessableEntity, gin.H{"errors": validationErrors})
return
}
// Kalau validasi sukses, lanjut proses pendaftaran
c.JSON(http.StatusOK, gin.H{"message": "Registration successful"})
}
2. Bikin Utility Validasi
Supaya lebih rapih, logika validasi kiata pisah di file utils/validation.go
. Di sini kita bisa bikin pesan error yang lebih manusiawi.
package utils
import (
"fmt"
"strings"
"github.com/go-playground/validator/v10"
)
type ValidationError struct {
Field string `json:"field"`
Message string `json:"message"`
}
func ValidateStruct(validate *validator.Validate, data interface{}) []ValidationError {
var errors []ValidationError
if err := validate.Struct(data); err != nil {
for _, err := range err.(validator.ValidationErrors) {
field := strings.ToLower(err.Field())
tag := err.Tag()
var message string
switch tag {
case "required":
message = fmt.Sprintf("%s wajib diisi", field)
case "min":
message = fmt.Sprintf("%s minimal %s karakter", field, err.Param())
case "email":
message = "format email tidak valid"
default:
message = fmt.Sprintf("%s tidak valid (%s)", field, tag)
}
errors = append(errors, ValidationError{Field: field, Message: message})
}
}
return errors
}
3. Coba Jalankan
Jalankan aplikasi dengan:
go run main.go
Server jalan di http://localhost:8080
.
Kalau kita kirim request ke /register
tanpa isi semua field, server bakal balikin error JSON yang jelas.
4. Kesimpulan
Dengan Gin + go-playground/validator
, validasi input jadi simpel tapi powerful.
kita bisa pastikan data user sesuai aturan sebelum lanjut ke proses berikutnya.
Pesan error pun bisa disesuaikan biar lebih ramah buat pengguna.