0Pricing
Go Academy · レッスン

リクエストバインディングとバリデーション

ShouldBindJSON、バインディングタグ、validator

「リクエストバインディングとバリデーション」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

リクエストボディのバインディング

Ginでは、binding構造体タグとc.ShouldBind*関数を使用して、JSON、XML、フォームデータ、クエリ文字列をGoの構造体にバインドできます。

type CreateUserRequest struct {
    Name  string `json:"name"  binding:"required"`
    Email string `json:"email" binding:"required,email"`
    Age   int    `json:"age"   binding:"gte=0,lte=150"`
}

func createUser(c *gin.Context) {
    var req CreateUserRequest
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
}

ShouldBindとMustBind

ShouldBind*はエラーを返すため、呼び出し側で処理します。Bind*(Mustバリアント)は、エラー時に自動的に400レスポンスを書き込み、処理を中断します。カスタムエラーレスポンスを返したい場合はShouldBindを使用します。

クエリのバインディング

c.ShouldBindQueryを使用すると、クエリ文字列のパラメータを構造体にバインドできます。

type ListRequest struct {
    Page  int `form:"page"  binding:"gte=1"`
    Limit int `form:"limit" binding:"gte=1,lte=100"`
}
var q ListRequest
c.ShouldBindQuery(&q)

パスパラメータのバインディング

c.ShouldBindUriを使用すると、パスパラメータを構造体にバインドできます。

type IDParam struct {
    ID int64 `uri:"id" binding:"required,gt=0"`
}
var p IDParam
c.ShouldBindUri(&p)

バリデーションタグ

Ginはgithub.com/go-playground/validator/v10を使用します。一般的なタグには、required、email、min、max、gte、lte、len、oneofがあります。

カスタムバリデーター

binding.Validator.Engine()を使用して、カスタムバリデーション関数を登録します。

validate := binding.Validator.Engine().(*validator.Validate)
validate.RegisterValidation("username", validateUsername)

バリデーションエラーレスポンス

バリデーターのエラーを解析し、フィールド名とメッセージを含む、ユーザーにわかりやすいレスポンスに変換します。

var ve validator.ValidationErrors
if errors.As(err, &ve) {
    errs := make([]string, len(ve))
    for i, e := range ve {
        errs[i] = fmt.Sprintf("%s: %s", e.Field(), e.Tag())
    }
    c.JSON(400, gin.H{"errors": errs})
}

Multipartフォームのファイル

c.FormFileを使用してファイルのアップロードを処理します。

file, _ := c.FormFile("avatar")
c.SaveUploadedFile(file, "./uploads/"+file.Filename)

Content-Typeネゴシエーション

GinのShouldBindは、Content-Typeに基づいてバインディング方法を自動的に選択します(application/jsonにはJSON、application/x-www-form-urlencodedにはフォーム)。

リクエストボディの最大サイズ

メモリ枯渇を防ぐため、リクエストボディのサイズを制限します。

r.MaxMultipartMemory = 8 << 20 // 8 MiB for multipart

ネストした構造体のバリデーション

バリデーションはネストした構造体に対して再帰的に実行されます。スライスの要素を検証するにはdiveを使用します。

Tags []string `json:"tags" binding:"required,dive,min=1,max=30"`

クイックチェック

Ginにおけるc.ShouldBindJSONとc.BindJSONの違いは何でしょうか。

まとめ:リクエストのバインディング

重要なポイント:

  • 型付きバインディングにはShouldBindJSON/ShouldBindQuery/ShouldBindUriを使用します
  • go-playground/validatorによるbinding:"required,email,gte=0"タグを使用します
  • カスタムバリデーターはbinding.Validator.Engine()で登録します
  • ValidationErrorsを解析して、フィールド単位のエラーメッセージを生成します

よくある質問

「リクエストバインディングとバリデーション」レッスンは無料ですか?

はい。「リクエストバインディングとバリデーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「リクエストバインディングとバリデーション」で何を学びますか?

ShouldBindJSON、バインディングタグ、validator ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「リクエストバインディングとバリデーション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Ginルーターとルートグループ
  2. リクエストバインディングとバリデーション
  3. レスポンスヘルパーとステータスコード
  4. Ginミドルウェア:認証とロギング
← Go Academyに戻る