Apps Artificial Intelligence CSS DevOps Go JavaScript Laravel Linux MongoDB MySQL PHP Python Rust Vue

Implementasi Validasi di Aplikasi Web dengan Gin dan Go

2 min read .
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.

Lihat Juga

chevron-up