Обзор
В предыдущей статье сообщалось, что платформа Gin использует Logrus для ведения журнала, а в этой статье рассказывается о привязке данных и проверке среды Gin.
Читатель задал мне вопрос, как сделать так, чтобы лог работы фреймворка не выводился в консоль?
решение:
engine := gin.Default() //修改成如下
engine := gin.New()
Как я узнал? Посмотрите на код фреймворка.
Default():
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
New()Код выкладывать не буду.
Мы виделиDefault()Используются два промежуточных ПОLogger(), Recovery(), если вы не хотите его использовать, просто используйте его напрямуюNew()Вот и все.
Начните сегодняшнюю статью.
Например, запросv1/member/addдобавить метод участника,name,ageтребуется, иnameНе может совпадать со строкой администратора, 10
Просто посмотрите на код.
Во-первых, определите структуру.
entity/member.go
package entity
// 定义 Member 结构体
type Member struct {
Name string `form:"name" json:"name" binding:"required,NameValid"`
Age int `form:"age" json:"age" binding:"required,gt=10,lt=120"`
}
в обязательном порядкеrequired, это идет с фреймворком,NameValid, который определяется сам по себе.
Вопрос 1: Какие параметры привязки входят в состав фреймворка?
Вопрос 2: Как написать собственный метод аутентификации?
Следующее, о чем стоит поговорить, это второй вопрос, напишите метод проверки.
validator/member/member.go
package member
import (
"gopkg.in/go-playground/validator.v8"
"reflect"
)
func NameValid(
v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value,
field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string,
) bool {
if s, ok := field.Interface().(string); ok {
if s == "admin" {
return false
}
}
return true
}
Затем привяжите маршрут:
router/router.go
package router
import (
"ginDemo/middleware/logger"
"ginDemo/middleware/sign"
"ginDemo/router/v1"
"ginDemo/router/v2"
"ginDemo/validator/member"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"gopkg.in/go-playground/validator.v8"
)
func InitRouter(r *gin.Engine) {
r.Use(logger.LoggerToFile())
// v1 版本
GroupV1 := r.Group("/v1")
{
GroupV1.Any("/product/add", v1.AddProduct)
GroupV1.Any("/member/add", v1.AddMember)
}
// v2 版本
GroupV2 := r.Group("/v2").Use(sign.Sign())
{
GroupV2.Any("/product/add", v2.AddProduct)
GroupV2.Any("/member/add", v2.AddMember)
}
// 绑定验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("NameValid", member.NameValid)
}
}
Наконец, взгляните на код вызова.
router/v1/member.go
package v1
import (
"ginDemo/entity"
"github.com/gin-gonic/gin"
"net/http"
)
func AddMember(c *gin.Context) {
res := entity.Result{}
mem := entity.Member{}
if err := c.ShouldBind(&mem); err != nil {
res.SetCode(entity.CODE_ERROR)
res.SetMessage(err.Error())
c.JSON(http.StatusForbidden, res)
c.Abort()
return
}
// 处理业务(下次再分享)
data := map[string]interface{}{
"name" : mem.Name,
"age" : mem.Age,
}
res.SetCode(entity.CODE_ERROR)
res.SetData(data)
c.JSON(http.StatusOK, res)
}
Посетите, чтобы увидеть эффект.
доступ:http://localhost:8080/v1/member/add
{
"code": -1,
"msg": "Key: 'Member.Name' Error:Field validation for 'Name' failed on the 'required' tag\nKey: 'Member.Age' Error:Field validation for 'Age' failed on the 'required' tag",
"data": null
}
доступ:http://localhost:8080/v1/member/add?name=1
{
"code": -1,
"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'required' tag",
"data": null
}
доступ:http://localhost:8080/v1/member/add?age=1
{
"code": -1,
"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'required' tag",
"data": null
}
доступ:http://localhost:8080/v1/member/add?name=admin&age=1
{
"code": -1,
"msg": "Key: 'Member.Name' Error:Field validation for 'Name' failed on the 'NameValid' tag",
"data": null
}
доступ:http://localhost:8080/v1/member/add?name=1&age=1
{
"code": -1,
"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'gt' tag",
"data": null
}
доступ:http://localhost:8080/v1/member/add?name=1&age=121
{
"code": -1,
"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'lt' tag",
"data": null
}
доступ:http://localhost:8080/v1/member/add?name=Tom&age=30
{
"code": 1,
"msg": "",
"data": {
"age": 30,
"name": "Tom"
}
}
Нельзя избежать возврата слишком большого количества информации, и подсказки об ошибках также могут быть унифицированы.
if err := c.ShouldBind(&mem); err != nil {
res.SetCode(entity.CODE_ERROR)
res.SetMessage("参数验证错误")
c.JSON(http.StatusForbidden, res)
c.Abort()
return
}
На этот раз структура каталогов была немного изменена, поэтому давайте поговорим об этом здесь:
├─ ginDemo
│ ├─ common //公共方法
│ ├── common.go
│ ├─ config //配置文件
│ ├── config.go
│ ├─ entity //实体
│ ├── ...
│ ├─ middleware //中间件
│ ├── logger
│ ├── ...
│ ├── sign
│ ├── ...
│ ├─ router //路由
│ ├── ...
│ ├─ validator //验证器
│ ├── ...
│ ├─ vendor //扩展包
│ ├── github.com
│ ├── ...
│ ├── golang.org
│ ├── ...
│ ├── gopkg.in
│ ├── ...
│ ├─ Gopkg.toml
│ ├─ Gopkg.lock
│ ├─ main.go
будетsignиloggerНастройте его на промежуточное программное обеспечение и поместите его вmiddlewareкаталог промежуточного программного обеспечения.
недавно добавленныйcommonКаталог общедоступных методов.
недавно добавленныйvalidatorКаталог аутентификатора.
недавно добавленныйentityКаталог сущностей.
Я вставлю конкретный код вGitHub, если вы заинтересованы, вы можете перейти к:GitHub.com/Бессердечный не…
Если проблема не решена, какие параметры привязки идут в комплекте с фреймворком?
Из исходного кода фреймворка понятно, что проверка использует:
gopkg.in/go-playground/validator.v8
Адрес документа:
перейти на doc.org/GOP кг.in/go…
Изучите документацию, там много правил валидации.
Рекомендуемое чтение
Джин каркас
- Gin Framework — привязка и проверка данных
- Gin Framework — ведение журнала с помощью Logrus
- Gin framework — установка и настройка маршрутизации
Основы
- Перейти - функции
- Идти - петля
- Go - Коллекция карт
- Перейти — Структура Структура
- Идти - Нарезать
- Перейти — Массивы
- Go - объявление переменной
- Перейти — Установка среды
Эту статью можно переслать, пожалуйста, укажите автора и источник для пересылки, спасибо!