Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go API Validation error handling

Go API Validation error handling

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

Kazuki Higashiguchi

May 27, 2019
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. © - BASE, Inc.
    Go製APIの
    Validation error
    handling
    . . #gouncon kg
    Go Un Conference kg - @hgsgtk

    View full-size slide

  2. © - BASE, Inc.
    このトークで持ち帰れること
    • Goでのバリデーションハンドリングの実例
    • ネット上でなかなか⾒つからない(個⼈談)
    • UseCase: HTTPリクエスト時‧DB保存時
    • Question/Suggestionください
    • 即時に反映されるかも知れません

    View full-size slide

  3. © - BASE, Inc.
    ⾃⼰紹介
    東⼝和暉 (Kazuki Higashiguchi)
    Twitter / GitHub : @hgsgtk
    バックエンドエンジニア
    BASE BANK, Inc. / Dev Division
    Go歴:
    - 趣味:2017.7〜
    - 仕事:2018.6〜

    View full-size slide

  4. © - BASE, Inc.
    前提:全体パッケージ構成とUseCase
    バリデーション発⽣箇所
    バリデーション発⽣箇所

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. © - BASE, Inc.
    Step Validatorを作成する > 使⽤ライブラリ
    • go-playground/validator
    • https://github.com/go-playground/validator
    • ginフレームワークで公式採⽤されている
    • →このライブラリをwrapした validation パッケージ
    を作成

    View full-size slide

  9. © - BASE, Inc.
    go-playground/validatorの利⽤例
    こんな感じで validate タグ設定できる

    View full-size slide

  10. © - BASE, Inc.
    Step : Validatorを作成する > validation パッケージ
    • go-playground/validator を各種import

    View full-size slide

  11. © - BASE, Inc.
    Step : Validatorを作成する
    • NewRequestValidator: Request Validator
    • NewDBValidator: Database Validator

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  15. © - BASE, Inc.
    Step : Validatorを作成する > 作成されたValidator

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  22. © - BASE, Inc.
    Step : バリデーション結果
    • error interfaceを満たした独⾃エラー型を作成する
    • 独⾃エラー型は、GetDetail()をシグネチャに持つ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  28. © - BASE, Inc.
    Step : バリデーション結果を利⽤ > エラーレスポンス

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. © - BASE, Inc.
    まとめ
    • ネット上にGoでのバリデーションハンドリングの実
    例を晒した
    • Question/Suggestionください
    • 即時に反映されるかも知れません

    View full-size slide

  33. Any Question or Suggestion?

    View full-size slide