1

gin フレームワークを使用して、POST されたデータが構造体フィールド タイプと一致しないかどうかを判断し、API ユーザーにエラーを通知しようとしています。

type CreateApp struct {
    LearnMoreImage string `db:"learn_more_image" json:"learn_more_image,omitempty" valid:"string,omitempty"`
    ApiVersion     int64  `db:"api_version" json:"api_version" valid:"int,omitempty"`
}
...
func CreateApps(c *gin.Context) {
    var json models.CreateApp
    c.Bind(&json)

だから私が投稿するとき

curl -H "Content-Type: application/json" -d '{"learn_more_image":"someimage.jpg","api_version":"somestring"}' "http://127.0.0.1:8080/v1.0/apps"

フィールド 'api_version' (文字列として渡される) の POST されたデータが、バインドされている構造体フィールド (int) と一致しないかどうかを判断したいと思います。データが一致しない場合は、ユーザーにメッセージを送り返したいと思います。このため、ジン コンテキスト データをループして確認できることを望んでいました。

gin 関数 'c.Bind()' は、無効なデータとそれに続くすべてのデータ フィールドを省略しているようです。

4

1 に答える 1

1

Gin には検証エンジンが組み込まれています: https://github.com/bluesuncorp/validator/blob/v5/baked_in.go

ただし、独自のものを使用するか、完全に無効にすることができます。

バリデーターはワイヤ データ (json 文字列) を検証せず、バインドされた構造体を検証します。

LearnMoreImage string `db:"learn_more_image" json:"learn_more_image,omitempty" binding:"required"`
ApiVersion     int64  `db:"api_version" json:"api_version" binding:"required,min=1"`

これに注意してください: binding:"required,min=1"

それで:

err := c.Bind(&json)

またはミドルウェアを使用して読み取りますc.Errors

更新しました:

3 つの回避策:

  • 独自の json 文字列を検証します (enconding/json では実行できません)。
  • 整数が > 0 であるかどうかを検証する binding:"min=1"
  • Struct の代わりに map[string]interface{} を使用してから、型を検証します。

    func endpoint(c *gin.Context) {
        var json map[string]interface{}
        c.Bind(&json)
        struct, ok := validateCreateApp(json)
        if ok { /** DO SOMETHING */ }
    }
    
    func validateCreateApp(json map[string]interface{}) (CreateApp, bool) {
        learn_more_image, ok := json["learn_more_image"].(string)
        if !ok {
            return CreateApp{}, false
        }
        api_version, ok = json["api_version"].(int)
        if !ok {
            return CreateApp{}, false
        }
        return CreateApp{
            learn_more_image, api_version,
        }
    }
    
于 2015-06-07T09:52:16.577 に答える