Implementasi Validasi di Aplikasi Web dengan Gin dan Go
Validasi data adalah bagian penting dari aplikasi web. Dengan validasi, saya memastikan data yang diterima dari klien sesuai dengan aturan tertentu sebelum diproses lebih lanjut. Pada artikel ini, saya akan membangun aplikasi sederhana dengan Gin di Go dan menggunakan paket go-playground/validator
untuk menangani aturan validasi.
Struktur Proyek
project/
│
├── main.go
└── utils/
└── validation.go
1. Membuat Aplikasi Gin
Buat file main.go
sebagai entry point aplikasi. kita akan membuat endpoint /register
untuk pendaftaran user.
package main
import (
"net/http"
"website/utils"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// User merepresentasikan data user yang 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": "Request body tidak valid"})
return
}
validate := validator.New()
validationErrors := utils.ValidateStruct(validate, user)
if len(validationErrors) > 0 {
c.JSON(http.StatusUnprocessableEntity, gin.H{"errors": validationErrors})
return
}
// Lanjutkan proses pendaftaran jika validasi sukses
c.JSON(http.StatusOK, gin.H{"message": "Pendaftaran berhasil"})
}
2. Menambahkan Logika Validasi
Buat file utils/validation.go
. Fungsi ini akan mengubah error validasi menjadi pesan yang lebih mudah dipahami.
package utils
import (
"fmt"
"strings"
"github.com/go-playground/validator/v10"
)
// ValidationError merepresentasikan error validasi
type ValidationError struct {
Field string `json:"field"`
Message string `json:"message"`
}
// ValidateStruct memvalidasi data dan mengembalikan array error validasi
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("Field %s wajib diisi", field)
case "min":
message = fmt.Sprintf("Field %s minimal %s karakter", field, err.Param())
case "email":
message = fmt.Sprintf("Field %s harus berupa email yang valid", field)
default:
message = fmt.Sprintf("Field %s tidak valid (%s)", field, tag)
}
errors = append(errors, ValidationError{Field: field, Message: message})
}
}
return errors
}
3. Contoh Request & Response
Request Valid
curl -X POST http://localhost:8080/register \
-H "Content-Type: application/json" \
-d '{"name":"Budi","email":"budi@example.com","password":"rahasia123"}'
Response
{
"message": "Pendaftaran berhasil"
}
Request Invalid
curl -X POST http://localhost:8080/register \
-H "Content-Type: application/json" \
-d '{"name":"Bo","email":"salah-email","password":"123"}'
Response
{
"errors": [
{
"field": "name",
"message": "Field name minimal 3 karakter"
},
{
"field": "email",
"message": "Field email harus berupa email yang valid"
},
{
"field": "password",
"message": "Field password minimal 6 karakter"
}
]
}
4. Kesimpulan
Dengan Gin dan go-playground/validator
, kita bisa menambahkan validasi data dengan mudah dan terstruktur.
Kelebihan pendekatan ini:
- Aturan validasi bisa ditulis langsung di struct tag.
- Pesan error bisa dikustomisasi sesuai kebutuhan.
- Membuat API lebih ramah untuk klien karena pesan error jelas.
Langkah selanjutnya, Anda bisa menambahkan aturan validasi lain (misalnya regex untuk nomor telepon, panjang maksimum, dll) agar aplikasi lebih robust.