GoのAPIでのValidation Error Handlingの実装例です。
© - BASE, Inc.Go製APIのValidation errorhandling. . #gouncon kgGo Un Conference kg - @hgsgtk
View Slide
© - BASE, Inc.このトークで持ち帰れること• Goでのバリデーションハンドリングの実例• ネット上でなかなか⾒つからない(個⼈談)• UseCase: HTTPリクエスト時‧DB保存時• Question/Suggestionください• 即時に反映されるかも知れません
© - BASE, Inc.⾃⼰紹介東⼝和暉 (Kazuki Higashiguchi)Twitter / GitHub : @hgsgtkバックエンドエンジニアBASE BANK, Inc. / Dev DivisionGo歴:- 趣味:2017.7〜- 仕事:2018.6〜
© - BASE, Inc.前提:全体パッケージ構成とUseCaseバリデーション発⽣箇所バリデーション発⽣箇所
© - BASE, Inc.こんな感じのバリデーションエラーを返したい
© - BASE, Inc.バリデーション実装全体像
© - BASE, Inc.バリデーション実装STEP >
© - BASE, Inc.Step Validatorを作成する > 使⽤ライブラリ• go-playground/validator• https://github.com/go-playground/validator• ginフレームワークで公式採⽤されている• →このライブラリをwrapした validation パッケージを作成
© - BASE, Inc.go-playground/validatorの利⽤例こんな感じで validate タグ設定できる
© - BASE, Inc.Step : Validatorを作成する > validation パッケージ• go-playground/validator を各種import
© - BASE, Inc.Step : Validatorを作成する• NewRequestValidator: Request Validator• NewDBValidator: Database Validator
© - BASE, Inc.バリデータを作成する NewValidator()Step : Validatorを作成する
© - BASE, Inc.カスタムエラーメッセージの定義デフォルトは構造体名が出る → タグ名に変更Step : Validatorを作成する
© - BASE, Inc.Step : Validatorを作成する > tagNameFuncの作成• tagNameFuncを作成• See also: https://github.com/go-playground/validator/issues/•
© - BASE, Inc.Step : Validatorを作成する > 作成されたValidator
© - BASE, Inc.Step : バリデーション実⾏
© - BASE, Inc.Step : カスタムタグ登録
© - BASE, Inc.Step : カスタムタグを作って利⽤する• “inlist”というタグを作る例
© - BASE, Inc.Step : カスタムタグを作って利⽤する• “inlist”というタグを作る例“Inlist”タグは、“inStatusList()”というルールを実⾏
© - BASE, Inc.Step : バリデーション結果• error interfaceを満たした独⾃エラー型を作成する• 独⾃エラー型は、GetDetail()をシグネチャに持つ
© - BASE, Inc.Step : バリデーション結果 >バリデータが返すバリデーション結果
© - BASE, Inc.Step : バリデーション結果 >バリデータが返すバリデーション結果Detail内にバリデーション結果が含まれる
© - BASE, Inc.Step : バリデーション結果を利⽤ > 構造体への設定• バリデーションしたい構造体に validate タグを設定• 構造体⾃⾝がvalidatorを実⾏する振る舞いを持つ
© - BASE, Inc.Step : バリデーション結果を利⽤ > エラー結果を利⽤• error 型で返却される• validation.Error interface型か判定
© - BASE, Inc.Step : バリデーション結果を利⽤ > エラーレスポンス
© - BASE, Inc.Step : バリデーション結果を利⽤ >こんな感じのバリデーションエラーを返る
© - BASE, Inc.Step : バリデーション結果を利⽤ >DB保存時のバリデーション
© - BASE, Inc.Step : バリデーション結果を利⽤ >DB保存時のバリデーションINSERTのSQL実⾏前にバリデーション
© - BASE, Inc.まとめ• ネット上にGoでのバリデーションハンドリングの実例を晒した• Question/Suggestionください• 即時に反映されるかも知れません
Any Question or Suggestion?