リクエストバインディングとバリデーション
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Ginルーターとルートグループ
- リクエストバインディングとバリデーション
- レスポンスヘルパーとステータスコード
- Ginミドルウェア:認証とロギング