kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

Golangでバリデーションチェックを行う

本章では、Go言語でバリデーションチェックを行う方法について共有します。

前提

WEBアプリで利用する目的で、バリデーションチェックを準備します。構成は、以下の通りです。

  • forms
    • webのリクエストフォームを定義した構造体。バリデーションチェックで利用するルールも定義します。
  • webs
    • ユーザーからの入力を上記構造体に入れ、入力内容を検証します。

プログラム

まず、リクエストフォームを定義した構造体を準備します。validatorとして、以下のライブラリを利用します。
godoc.org

構造体のタグに「validate」を記述し、検証方法を定義します。今回のサンプルを例にすると、以下の通りです。

  • reguired
    • 入力が必須であること
  • min=n
    • 最小文字数n文字であること
  • max=n
    • 最大文字数がn文字であること
  • alpha
    • アルファベットのみであること
  • email
    • Email形式であること

[forms/user.go]

package forms

import (
	"gopkg.in/go-playground/validator.v9"
)

type User struct {
	Name      string `validate:"required,min=5,max=25,alpha"`
	FirstName string `validate:"required"`
	LastName  string `validate:"required"`
	Email     string `validate:"required,email"`
}

// バリデーションチェックを行って、結果とNGの場合にエラーメッセージ群を返す
func (form *User) Validate() (ok bool, result map[string]string) {
	result = make(map[string]string)
	// 構造体のデータをタグで定義した検証方法でチェック
	err := validator.New().Struct(*form)
	if err != nil {
		errors := err.(validator.ValidationErrors)
		if len(errors) != 0 {
			for i := range errors {
				// フィールドごとに、検証
				switch errors[i].StructField() {
				case "Name":
					switch errors[i].Tag() {
					case "required", "min", "max", "alpha":
						result["Name"] = "5文字以上25文字以下のアルファベットで入力してください"
					}
				case "FirstName":
					switch errors[i].Tag() {
					case "required":
						result["FirstName"] = "名を入力してください"
					}
				case "LastName":
					switch errors[i].Tag() {
					case "required":
						result["LastName"] = "姓を入力してください"
					}
				case "Email":
					switch errors[i].Tag() {
					case "required", "email":
						result["Email"] = "正しいメールアドレス形式で入力してください"
					}
				}
			}
		}
		return false, result
	}
	return true, result
}

次に、ユーザーからのリクエストを捌くコントローラーを準備します。
[webs/user.go]

package webs

import (
	"fmt"
	"html/template"
	"net/http"
	"strconv"
	"strings"
)

func SaveUser(w http.ResponseWriter, r *http.Request) {
	// リクエスト内容を構造体に格納する
	form := forms.User{
		Name:      r.FormValue("name"),
		FirstName: r.FormValue("firstName"),
		LastName:  r.FormValue("lastName"),
		Email:     r.FormValue("email"),
	}

	// バリデーションの検証を行う
	if ok, errorMessages := form.Validate(); !ok {
		// バリデーションエラー結果「result["hogehoge"]」をhtmlのtemplateに返して、表示させる
	}
	// 後続の処理を行う
}

筆休め

WEBサイトを作る上で、ユーザーからの入力内容を検証することは必須です。Go言語では、バリデーションチェックを行うライブラリは内蔵されていないため、少し工夫が必要になります。

以上、「Golangでバリデーションチェックを行う」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.