Go言語でバリデーション処理を勉強しよう!

こんにちは。KOUKIです。

今回は、サーバーサイド側のバリデーション処理をGo言語で実装しようと思います。

バリデーション処理とは、Webページのフォームなどから送信されたデータが「開発者が意図したデータ通りの形式で送られてきたか」チェックする仕組みです。

Web開発をする上では欠かせない、非常に重要な事柄なので、この機会に一緒に学習しましょう^^

ワークスペースの用意

ざっくりとWebページを作る

Go言語では、text/templateパッケージを使うとページ情報をブラウザ上に表示させることができます。

この機能を使って、まずはWebページからフォームデータを送信できる簡易アプリを作成しましょう。

models.go

models.goには、送信データを格納する構造体を定義します。

main.go

main.goには、Webサーバーとテンプレートファイルをブラウザへ返す処理を実装します。バリデーションの呼び出しもこのファイルに書くつもりです。

r.Form.Get("email") などで指定している引数は、input要素のname属性の値です。ここはわかりずらいので、明記しておきます。

form.tmpl

ここには、Webページのフォームを記載します。

{{$res := index .Data “validation”}}」などの構文は、text/templateパッケージのテンプレート構文です。本記事の目的とは関係ないので、参考程度にしておいてください。

result.tmpl

result.tmplは、バリデーションチェックにpassした時の遷移先です。

アプリを起動

アプリを起動してみましょう。

次に「http://localhost:8080/」へアクセスします。

適当に文字を打ち込んで、Submitしてみます。

こんな感じになりました。
バリデーション処理を実装し、そのチェックがNGの場合はResultページへは遷移せず、フォームのテキストボックスにエラーを表示するようにします。

バリデーション処理の実装

バリデーション処理を実装する上で一つ言っておきたいことがあります。

それは、やり方は色々あるということです。

ここで紹介する方法は、その内の一つになります。

errors.go

errors.goには、バリデーションチェックのエラー情報を格納します。

errorsには、バリデーションチェック結果でNGの場合、フォームのフィールド名(email,password)とエラーメッセージを格納します。

エラーメッセージは複数格納される場合があるので、最初にNGになったエラーのみを返すようにしています。

forms.go

forms.goには、カスタムフォーム構造体とバリデーションメソッドを定義します。

バリデーションチェックメソッドは、後ほど実装します。

url.Valuesは、フォームからデータを送られてきた時、PostForm関数で取得できる戻り値の型です。パースされたフォームの情報が入り、引数にはinput要素のname(email,password)がkeyとして入るようです。

公式サイトにわかりやすい例があります。

フォームを作成したので、models.goのTemplateDataの「Form」を書き換えましょう。

必須チェック

最初のバリデーションとして、必須チェックをforms.goに追加してみましょう。

fieldsには、emailやpasswordなどフォームのname属性の値が入ります。

main.goのPOST処理に、このバリデーションメソッドを組み込みます。※GET処理でrenderTemplateのFormの引数も変えてます

アプリを再起動します。

http://localhost:8080にアクセスし、特に何も入力しないでSubmitボタンを押してみましょう。

いい感じですね。テキストボックスの赤いスタイリングは、Bootstrap5のis-invalidを使って、装飾してます。

文字数チェック

必須チェックと同じ要領で、文字数チェックを実装しましょう。

先ほどと同じように、main.goのHome関数のPOST処理からこれらのメソッドを呼び出しましょう。

アプリを起動し直して、動作検証をします。

Email: test@com
Password: kkkkkkkkkkkkkkkkkkkkkkkkkkkkk

OKですね。機能追加がかなり楽です。

Emailチェック

Emailが正しい形式で送信されてきたかチェックしてみましょう。

仕事で、asaskevich/govalidatorを使ったことがあるので、これを組み込んでみます。

forms.goに以下のメソッドを追加します。

簡単ですね。組み合わせるのも悪くないです。

main.goのHome関数を編集します。

アプリを再起動して、フォームから次のパラメータを送信します。

Email: testdusuyo
Password: password

OKですね。

おわりに

めっちゃいい感じですね!
機能追加も楽だし、テストもしやすそうです。

バリデーションは、サーバーサイドとフロントエンド両方で実装することが望ましいと思いますが、結構めんどくさいところなので、こんな感じでスマートに実装できると良さそうですね^^

それでは、また!

関連記事

Go記事まとめ

Goソースコード

コメントを残す