Правильный текст запроса считается недействительным валидатором в Go

# #go

Вопрос:

Я пытаюсь проверить тело запроса в соответствии с этой структурой с помощью валидатора. Но в Postman он всегда выдает ошибку при проверке структуры. Я просто хочу, чтобы при отправке запроса требовались все значения.

 package model

type User struct {
    FeatureName string `json:"featureName" validate:"required"`
    Email       string `json:"email" validate:"required"`
    CanAccess   *bool  `json:"can_access" validate:"required"`
}
 

Я попытался отправить это в качестве тела запроса на почтальона:

 // Request body
{
    "featureName": "crypto",
    "email": "test5@gmail.com",
    "can_access": true
}

// Response body
{
    "status": 422,
    "message": "Missing parameters featureName/can_access/email"
}
 

Код:

 package controller

import (
    "database/sql"
    "encoding/json"
    "errors"
    "net/http"
    "unicode/utf8"

    "github.com/yudhiesh/api/model"
    "gopkg.in/validator.v2"

    "github.com/yudhiesh/api/config"
)

func InsertFeature(w http.ResponseWriter, r *http.Request) {
    var user model.User
    var response model.Response

    db := config.Connect()
    defer db.Close()

    // Decode body into user struct
    if err := json.NewDecoder(r.Body).Decode(amp;user); err != nil {
        response.Message = "Error"
        response.Status = http.StatusInternalServerError
        json.NewEncoder(w).Encode(response)
        return
    } else {
        // Validate struct to check if all fields are correct
        // Fails here!
        if err := validator.Validate(user); err != nil {
            response.Message = "Missing parameters featureName/can_access/email"
            response.Status = http.StatusUnprocessableEntity
            json.NewEncoder(w).Encode(response)
            return
        } else {
            // Execute insert statement to database
            stmt := `INSERT INTO features (user_id, feature_name, can_access) SELECT id, ?, ? FROM users WHERE email=?`
            if _, err = db.Exec(stmt, amp;user.FeatureName, amp;user.CanAccess, amp;user.Email); err != nil {
                response.Message = "Error"
                response.Status = http.StatusInternalServerError
                json.NewEncoder(w).Encode(response)
                return
            } else {
                response.Message = "Success"
                response.Status = http.StatusOK
                json.NewEncoder(w).Encode(response)
                return
            }

        }

    }

}
 

Комментарии:

1.Я вижу проблему в вашем коде, ссылка, которой вы поделились, есть https://github.com/go-playground/validator , но в коде импорт gopkg.in/validator.v2 , поэтому, если вы используете валидатор go-playground, создайте новый экземпляр валидатора и проверьте. т. е.; validatorInstance:=validator.New() validatorInstance.Struct(user)

2. @Key_coder Ах да, это сработало, пожалуйста, добавьте ответ, и я приму его!

Ответ №1:

Перемещение комментария в ответ

Я вижу проблему в вашем коде, ссылка, которой вы поделились, есть https://github.com/go-playground/validator , но в коде импорт gopkg.in/validator.v2 , если вы go-playground validator используете приведенный ниже код для проверки

 import https://github.com/go-playground/validator

validatorInstance:=validator.New()
validatorInstance.Struct(user)