Go API Validation error handling

Go API Validation error handling

GoのAPIでのValidation Error Handlingの実装例です。

88964b936e864ca7d326272eaa70fa9a?s=128

Kazuki Higashiguchi

May 27, 2019
Tweet

Transcript

  1. © - BASE, Inc. Go製APIの Validation error handling . .

    #gouncon kg Go Un Conference kg - @hgsgtk
  2. © - BASE, Inc. このトークで持ち帰れること • Goでのバリデーションハンドリングの実例 • ネット上でなかなか⾒つからない(個⼈談) •

    UseCase: HTTPリクエスト時‧DB保存時 • Question/Suggestionください • 即時に反映されるかも知れません
  3. © - BASE, Inc. ⾃⼰紹介 東⼝和暉 (Kazuki Higashiguchi) Twitter /

    GitHub : @hgsgtk バックエンドエンジニア BASE BANK, Inc. / Dev Division Go歴: - 趣味:2017.7〜 - 仕事:2018.6〜
  4. © - BASE, Inc. 前提:全体パッケージ構成とUseCase バリデーション発⽣箇所 バリデーション発⽣箇所

  5. © - BASE, Inc. こんな感じのバリデーションエラーを返したい

  6. © - BASE, Inc. バリデーション実装全体像

  7. © - BASE, Inc. バリデーション実装STEP >

  8. © - BASE, Inc. Step Validatorを作成する > 使⽤ライブラリ • go-playground/validator

    • https://github.com/go-playground/validator • ginフレームワークで公式採⽤されている • →このライブラリをwrapした validation パッケージ を作成
  9. © - BASE, Inc. go-playground/validatorの利⽤例 こんな感じで validate タグ設定できる

  10. © - BASE, Inc. Step : Validatorを作成する > validation パッケージ

    • go-playground/validator を各種import
  11. © - BASE, Inc. Step : Validatorを作成する • NewRequestValidator: Request

    Validator • NewDBValidator: Database Validator
  12. © - BASE, Inc. バリデータを作成する NewValidator() Step : Validatorを作成する

  13. © - BASE, Inc. カスタムエラーメッセージの定義 デフォルトは構造体名が出る → タグ名に変更 Step :

    Validatorを作成する
  14. © - BASE, Inc. Step : Validatorを作成する > tagNameFuncの作成 •

    tagNameFuncを作成 • See also: https://github.com/go-playground/ validator/issues/ •
  15. © - BASE, Inc. Step : Validatorを作成する > 作成されたValidator

  16. © - BASE, Inc. バリデーション実装STEP >

  17. © - BASE, Inc. Step : バリデーション実⾏

  18. © - BASE, Inc. Step : カスタムタグ登録

  19. © - BASE, Inc. Step : カスタムタグを作って利⽤する • “inlist”というタグを作る例

  20. © - BASE, Inc. Step : カスタムタグを作って利⽤する • “inlist”というタグを作る例 “Inlist”タグは、

    “inStatusList()”というルールを実⾏
  21. © - BASE, Inc. バリデーション実装STEP >

  22. © - BASE, Inc. Step : バリデーション結果 • error interfaceを満たした独⾃エラー型を作成する

    • 独⾃エラー型は、GetDetail()をシグネチャに持つ
  23. © - BASE, Inc. Step : バリデーション結果 > バリデータが返すバリデーション結果

  24. © - BASE, Inc. Step : バリデーション結果 > バリデータが返すバリデーション結果 Detail内に

    バリデーション結果が含まれる
  25. © - BASE, Inc. バリデーション実装STEP >

  26. © - BASE, Inc. Step : バリデーション結果を利⽤ > 構造体への設定 •

    バリデーションしたい構造体に validate タグを設定 • 構造体⾃⾝がvalidatorを実⾏する振る舞いを持つ
  27. © - BASE, Inc. Step : バリデーション結果を利⽤ > エラー結果を利⽤ •

    error 型で返却される • validation.Error interface型か判定
  28. © - BASE, Inc. Step : バリデーション結果を利⽤ > エラーレスポンス

  29. © - BASE, Inc. Step : バリデーション結果を利⽤ > こんな感じのバリデーションエラーを返る

  30. © - BASE, Inc. Step : バリデーション結果を利⽤ > DB保存時のバリデーション

  31. © - BASE, Inc. Step : バリデーション結果を利⽤ > DB保存時のバリデーション INSERTのSQL実⾏前に

    バリデーション
  32. © - BASE, Inc. まとめ • ネット上にGoでのバリデーションハンドリングの実 例を晒した • Question/Suggestionください

    • 即時に反映されるかも知れません
  33. Any Question or Suggestion?