Go에서 데이터 검증 구현

WBOY
풀어 주다: 2024-08-19 12:31:20
원래의
755명이 탐색했습니다.

Implement data validation in Go

데이터 검증은 소프트웨어 개발에서 중요한 부분입니다. 입력 데이터를 처리하거나 저장하기 전에 입력 데이터가 정확하고 요구 사항을 충족하는지 확인합니다. Go에서는 데이터 검증이 간단하고 유연합니다.

이 가이드에서는 구조체 태그를 사용하여 데이터를 검증하고 앱을 안전하고 신뢰할 수 있게 만드는 방법을 알려드립니다. 검증 로직 생성부터 내장 검증 태그 사용까지.

전제 조건

  • 1.21로 이동

프로젝트 설정

Go 프로젝트 종속성을 설정합니다.

go mod init app
go get github.com/gin-gonic/gin
로그인 후 복사

프로젝트 구조

├─ main.go
├─ models
│ └─ user.go
└─ public
   └─ index.html
로그인 후 복사

프로젝트 파일

user.go

사용자 구조체는 특정 규칙을 적용하기 위해 유효성 검사 태그를 통합하여 애플리케이션 내에서 유효성 검사를 테스트하도록 설계되었습니다.

package models

type User struct {
    Id int `binding:"required" msg:"Required"`
    Name string `binding:"max=10" msg:"Maximum length is 10"`
    Email string `binding:"email" msg:"Invalid email address"`
    Age int `binding:"min=1,max=100" msg:"Must between 1 and 100"`
    BirthDate string `binding:"datetime=01/02/2006" msg:"Invalid date format"`
}
로그인 후 복사

기본 오류 메시지는 사용자에게 친숙하지 않기 때문에 보다 의미 있는 오류 메시지를 정의하기 위해 사용자 정의 msg 태그를 추가했습니다.

main.go

이 파일은 애플리케이션의 주요 진입점입니다. 최소한의 Go 웹 애플리케이션을 생성하고 설정합니다.

package main

import (
    "app/models"
    "net/http"
    "reflect"

    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
)

func main() {
    router := gin.Default()
    router.LoadHTMLFiles("public/index.html")
    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)
    })
    router.POST("/", func(c *gin.Context) {
        var user models.User
        if err := c.ShouldBind(&user); err != nil {
            c.HTML(http.StatusOK, "index.html", gin.H{"User": user, "Errors": getErrors(err, user)})
            return
        }
        c.HTML(http.StatusOK, "index.html", gin.H{"Pass": true, "User": user})
    })
    router.Run()
}

func getErrors(err error, obj any) map[string]string {
    messages := getMessages(obj)
    errors := map[string]string{}
    for _, e := range err.(validator.ValidationErrors) {
        errors[e.Field()] = messages[e.Field()]
    }
    return errors
}

func getMessages(obj any) map[string]string {
    t := reflect.TypeOf(obj)
    messages := map[string]string{}
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        messages[field.Name] = field.Tag.Get("msg")
    }
    return messages
}
로그인 후 복사
  • GET 메소드를 사용하여 입력 양식을 반환합니다.
  • 양식 제출 및 사용자 입력 유효성 검사를 위한 POST 방법입니다.
  • getErrors()는 오류 정보를 반환합니다.
  • getMessages()는 사용자 정의 msg 태그를 활용하여 특정 필드에 대한 오류 메시지를 검색합니다.

index.html

HTML 사용자 입력 양식은 사용자 구조체에 적용되는 유효성 검사 규칙을 테스트하도록 설계되었습니다. 일반적으로 User 구조체의 속성에 해당하는 필드가 포함됩니다.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" rel="stylesheet">
    <script>
        function fill(valid) {
            document.getElementById('id').value = (valid ? '1' : '')
            document.getElementById('name').value = (valid ? 'foo' : 'my name is foo')
            document.getElementById('email').value = (valid ? 'foo@mail.com' : 'mail')
            document.getElementById('age').value = (valid ? '10' : '101')
            document.getElementById('birthdate').value = (valid ? '01/01/2000' : '01012000')
        }
    </script>
</head>

<body>
    <div class="container">
        <div class="row mt-3">
            <form method="post">
                <div class="mb-3 col-12">
                    <label class="form-label" for="id">Id</label>
                    <input id="id" name="Id" class="form-control form-control-sm" value="{{.User.Id}}" />
                    {{if .Errors.Id}}<span class="text-danger">{{.Errors.Id}}</span>{{end}}
                </div>
                <div class="mb-3 col-12">
                    <label class="form-label" for="name">Name</label>
                    <input id="name" name="Name" class="form-control form-control-sm" value="{{.User.Name}}" />
                    {{if .Errors.Name}}<span class="text-danger">{{.Errors.Name}}</span>{{end}}
                </div>
                <div class="mb-3 col-12">
                    <label class="form-label" for="email">Email</label>
                    <input id="email" name="Email" class="form-control form-control-sm" value="{{.User.Email}}" />
                    {{if .Errors.Email}}<span class="text-danger">{{.Errors.Email}}</span>{{end}}
                </div>
                <div class="mb-3 col-12">
                    <label class="form-label" for="age">Age</label>
                    <input id="age" name="Age" class="form-control form-control-sm" value="{{.User.Age}}" />
                    {{if .Errors.Age}}<span class="text-danger">{{.Errors.Age}}</span>{{end}}
                </div>
                <div class="mb-3 col-12">
                    <label class="form-label" for="birthdate">Birth Date</label>
                    <input id="birthdate" name="BirthDate" class="form-control form-control-sm" value="{{.User.BirthDate}}" />
                    {{if .Errors.BirthDate}}<span class="text-danger">{{.Errors.BirthDate}}</span>{{end}}
                </div>
                <div class="col-12">
                    <input type="button" class="btn btn-sm btn-danger" onclick="fill(0)" value="Fill invaid data" />
                    <input type="button" class="btn btn-sm btn-success" onclick="fill(1)" value="Fill vaid data" />
                    <button class="btn btn-sm btn-primary">Submit</button>
                </div>
                {{if .Pass}}
                <div class="alert alert-success mt-3">
                    Validation success!
                </div>
                {{end}}
            </form>
        </div>
    </div>
</body>
로그인 후 복사

우리는 {{if .Errors.Id}}와 같은 Go의 HTML 템플릿 구문을 사용하여 사용자에게 오류 메시지를 표시합니다.

프로젝트 실행

go run main.go
로그인 후 복사

웹 브라우저를 열고 http://localhost:8080

으로 이동합니다. 이 테스트 페이지를 찾을 수 있습니다.

Implement data validation in Go

테스트

"잘못된 데이터 채우기"를 클릭한 다음 "제출"을 클릭하면 입력 양식에 표시되는 오류 메시지를 볼 수 있습니다.

Implement data validation in Go

"유효한 데이터 입력"을 클릭한 다음 "제출"을 다시 클릭하세요. 입력 양식에 유효성 검사 성공 메시지가 표시되어야 합니다.

Implement data validation in Go

결론

이 기사에서는 안정적이고 사용자 친화적인 애플리케이션을 구축하는 데 도움이 되는 기본 데이터 유효성 검사 구현을 다뤘습니다. Go 웹 애플리케이션의 견고성과 유용성을 모두 향상하려면 이러한 방법을 적용하세요.

소스 코드: https://github.com/stackpuz/Example-Validation-Go

몇 분 만에 CRUD 웹 앱 만들기: https://stackpuz.com

위 내용은 Go에서 데이터 검증 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!