go-gin-api 規劃目錄和參數驗證(二)

来源:https://www.cnblogs.com/it-3327/archive/2019/11/09/11828538.html
-Advertisement-
Play Games

概述首先同步下項目概況:上篇文章分享了,使用 go modules 初始化項目,這篇文章咱們分享: 規劃目錄結構 模型綁定和驗證 自定義驗證器 制定 API 返回結構廢話不多說,咱們開始吧。規劃目錄結構 ├─ go-gin-api │ ├─ app │ ├─ config //配置文件 │ ├─ c ...


概述

首先同步下項目概況:



上篇文章分享了,使用 go modules 初始化項目,這篇文章咱們分享:

    規劃目錄結構

    模型綁定和驗證

    自定義驗證器

    制定 API 返回結構

廢話不多說,咱們開始吧。

規劃目錄結構

 

  ├─ go-gin-api    
    │  ├─ app    
    │     ├─ config           //配置文件    
    │        ├─ config.go    
    │     ├─ controller       //控制器層    
    │        ├─ param_bind    
    │        ├─ param_verify    
    │        ├─ ...    
    │     ├─ model            //資料庫ORM    
    │        ├─ proto    
    │        ├─ ...    
    │     ├─ repository       //資料庫操作層    
    │        ├─ ...    
    │     ├─ route            //路由    
    │        ├─ middleware    
    │        ├─ route.go    
    │     ├─ service          //業務層    
    │        ├─ ...    
    │     ├─ util             //工具包    
    │        ├─ ...    
    │  ├─ vendor  //依賴包    
    │     ├─ ...    
    │  ├─ go.mod    
    │  ├─ go.sum    
    │  ├─ main.go //入口文件

 



上面的目錄結構是我自定義的,大家也可以根據自己的習慣去定義。

controller 控制器層主要對提交過來的數據進行驗證,然後將驗證完成的數據傳遞給 service 處理。

在 gin 框架中,參數驗證有兩種:

1、模型綁定和驗證。

2、自定義驗證器。

其中目錄 param_bind,存儲的是參數綁定的數據,目錄 param_verify 存儲的是自定義驗證器。

接下來,讓咱們進行簡單實現。

模型綁定和驗證

比如,有一個創建商品的介面,商品名稱不能為空。

配置路由(route.go):

 

  ProductRouter := engine.Group("")    
    {    
        // 新增產品    
        ProductRouter.POST("/product", product.Add)    
        // 更新產品    
        ProductRouter.PUT("/product/:id", product.Edit)    
        // 刪除產品    
        ProductRouter.DELETE("/product/:id", product.Delete)    
        // 獲取產品詳情    
        ProductRouter.GET("/product/:id", product.Detail)    
    }

 


參數綁定(param_bind/product.go):

 

   type ProductAdd struct {    
        Name string `form:"name" json:"name" binding:"required"`    
    }

 


控制器調用(controller/product.go):

  

 if err := c.ShouldBind(&param_bind.ProductAdd{}); err != nil {    
        utilGin.Response(-1, err.Error(), nil)    
        return    
    }

 



咱們用 Postman 模擬 post 請求時,name 參數不傳或傳遞為空,會出現:

Key: 'ProductAdd.Name' Error:Field validation for 'Name' failed on the 'required' tag

這說明使用到了參數設置的 binding:"required"。

那麼還能使用 binding 哪些參數,有文檔嗎?

有。Gin 使用 go-playground/validator.v8 進行驗證,相關文檔:

https://godoc.org/gopkg.in/go-playground/validator.v8

接下來,咱們實現一下自定義驗證器。

自定義驗證器

比如,有一個創建商品的介面,商品名稱不能為空並且參數名稱不能等於 admin。

類似於這種業務需求,無法 binding 現成的方法,需要我們自己寫驗證方法,才能實現。

自定義驗證方法(param_verify/product.go)

    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    
    }

 



參數綁定(param_bind/product.go):

    type ProductAdd struct {    
        Name string `form:"name" json:"name" binding:"required,NameValid"`    
    }

 


同時還要綁定驗證器:

 

   // 綁定驗證器    
    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {    
        v.RegisterValidation("NameValid", param_verify.NameValid)    
    }

 


咱們用 Postman 模擬 post 請求時,name 參數不傳或傳遞為空,會出現:

Key: 'ProductAdd.Name' Error:Field validation for 'Name' failed on the 'required' tag

name=admin 時:

Key: 'ProductAdd.Name' Error:Field validation for 'Name' failed on the 'NameValid' tag

OK,上面兩個驗證都生效了!

上面的輸出都是在控制台,能不能返回一個 Json 結構的數據呀?

能。接下來咱們制定 API 返回結構。

制定 API 返回結構

 

   {    
        "code": 1,    
        "msg": "",    
        "data": null    
    }

 



API 介面的返回的結構基本都是這三個欄位。

比如 code=1 表示成功,code=-1 表示失敗。

msg 表示提示信息。

data 表示返回的數據。

那麼,我們怎麼在 gin 框架中實現它?

其實很簡單 基於 c.JSON() 方法進行封裝即可,直接看代碼。

 

   package util    
    import "github.com/gin-gonic/gin"    
    type Gin struct {    
        Ctx *gin.Context    
    }    
    type response struct {    
        Code     int         `json:"code"`    
        Message  string      `json:"msg"`    
        Data     interface{} `json:"data"`    
    }    
    func (g *Gin)Response(code int, msg string, data interface{}) {    
        g.Ctx.JSON(200, response{    
            Code    : code,    
            Message : msg,    
            Data    : data,    
        })    
        return    
    }

 



控制器調用(controller/product.go):

 

  utilGin := util.Gin{Ctx:c}    
    if err := c.ShouldBind(&param_bind.ProductAdd{}); err != nil {    
        utilGin.Response(-1, err.Error(), nil)    
        return    
    }

 



咱們用 Postman 模擬 post 請求時,name 參數不傳或傳遞為空,會出現:

    {    
        "code": -1,    
        "msg": "Key: 'ProductAdd.Name' Error:Field validation for 'Name' failed on the 'required' tag",    
        "data": null    
    }

 

 

name=admin 時:

    {    
        "code": -1,    
        "msg": "Key: 'ProductAdd.Name' Error:Field validation for 'Name' failed on the 'NameValid' tag",    
        "data": null    
    }

 


OK,上面兩個驗證都生效了!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • setInterval定時器解決request非同步: view溢出橫向滑動顯示: 跳轉傳參+返回傳參: ...
  • 由 楊柳依 創建於2019年11月3日,最近更新於2019年11月8日 參考資料: "大話設計模式" | "圖解設計模式" | "菜鳥教程—設計模式" UML類圖 【矩形框】代表一個類(Class)。類圖分三層: 第一層顯示類的名稱,如果是抽象類,則就用斜體顯示; 第二層是類的特性,通常就是欄位和屬 ...
  • 雖然之前已經學了2個月python,但仍然感覺學的很亂,沒有系統性;或者說自學的沒有條例,只是追求進度,沒有保證知識點的全面與準確。 從今天開始,從python的基礎變數開始重新整理知識點,梳理忽略的內容。願所學即所會,所會即能用。 1、變數名遵循的規則 只能包含字母、數字和下劃線。需要以字母或下劃 ...
  • 一、概述二、Struts2 快速入門程式2.1 開發流程比較2.2 引入依賴2.2 創建jsp頁面2.3 在web.xml中配置前端控制器2.4 創建struts.xml配置文件2.4 創建一個HelloAction類2.5 在struts.xml文件中配置HelloAction2.6 在index... ...
  • 手寫SpringMVC框架 細嗅薔薇 心有猛虎 背景:Spring 想必大家都聽說過,可能現在更多流行的是Spring Boot 和Spring Cloud 框架;但是SpringMVC 作為一款實現了MVC 設計模式的web (表現層) 層框架,其高開發效率和高性能也是現在很多公司仍在採用的框架; ...
  • 概述 今天給大家分享,在 API 端使用 Gin 框架時,項目的目錄。目錄 ├─ Project Name │ ├─ config //配置文件 │ ├── ... │ ├─ controller //控制器層 │ ├── ... │ ├─ service //業務層 │ ├── ... │ ├─ ...
  • 一、re舉例 import re #查找數字 p = re.compile(r"\d+") #在字元串“ongahjeuf125”中及逆行查找,按照規則p指定的正則進行查找 m = p.match("ong125fdsgdsf48515",3,20)#後面的參數序號3到6的搜索範圍 print(m) ...
  • 1. 引入工程依賴包 2. 編寫DAO介面 3. 編寫SQL配置文件(本人不太習慣註解,習慣將SQL寫在配置文件中) 4. 配置myBatis配置類,也可以放在啟動類上 5. 配置application.yml文件 6. 編寫controller,調用MyBatis 源代碼: "https://gi ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...