Как проверить сообщение JSON в запросе POST с помощью Beego - PullRequest
0 голосов
/ 05 августа 2020

Я использую Bee go для разработки веб-сервера.

Я использовал beego.Controller для обработки запросов POST. В моем случае запрос POST содержит JSON:

{
    "name": "titi",
    "password": "123456"
}

Вот мой код:

type TestController struct {
    beego.Controller
}

type User struct {
    Name     string `json:"name"`
    Password string `json:"password"`
}

func (c *TestController) Post() {
    var ob md.User
    var err error
    if err = json.Unmarshal(c.Ctx.Input.RequestBody, &ob); err == nil {
        logs.Debug(ob.Name)
        logs.Debug(len(ob.Name))
    } else {
        logs.Error("illegal JSON")
    }
}

Этот фрагмент кода работает нормально. С помощью тегов структуры User, "name" присваивается ob.Name, а "password" присваивается ob.Password.

Теперь я хочу протестировать некоторые исключения. Например, что, если запрос JSON не содержит ожидаемых ключей:

{
    "illegalKey1": "titi",
    "illegalKey2": "123456"
}

Как видите, я ожидаю "name" и "password", но теперь ключи становятся "illegalKey1" и "illegalKey2". Поэтому я думаю, что это может вызвать некоторые ошибки.

К моему удивлению, ошибки нет, потому что err == nil по-прежнему верно, а len(ob.Name) просто теперь становится 0.

Итак, есть ли какой-нибудь хороший способ обработать этот случай в Go / Bee go?

Я имею в виду, я знаю, что

if len(ob.Name) == 0 {
    logs.Error("illegal JSON")
}

в порядке, но мне интересно, есть ли какие-то какой код более красивый? В противном случае, если в JSON 10 полей, я должен сделать такое if 10 раз. Очевидно, это совсем нехорошо.

1 Ответ

0 голосов
/ 05 августа 2020

Чтобы убедиться, что JSON не содержит неожиданных полей, вы можете использовать Decoder из пакета "encoding/json" и его метод DisallowUnknownFields . См. Пример здесь https://play.golang.org/p/bif833qxytE

Обратите внимание, что json.NewDecoder принимает io.Reader в качестве входных данных. Вы можете создать io.Reader из []byte, используя байт. NewReader

Другой topi c проверяет, что JSON содержит все ожидаемые поля (ИЛИ эти поля в определенном формате). Ответ на вопрос, как заставить его работать с пакетом "encoding/json", заключается в реализации пользовательского UnmarshalJSON для структуры, можно найти здесь . Но я бы не предлагал использовать этот подход для такой задачи, потому что в основном это проверка ввода, и я бы предпочел использовать пакеты проверки, чтобы не смешивать обязанности. Самый распространенный - go -playground / validator.v9 , где вам следует искать тег required. Случаи валидации обсуждаются здесь .

...