天天看點

Golang Gin架構資料綁定和Gorm架構的資料解析

作者:312每天一個短知識

Gin架構的資料綁定和解析分為Json資料綁定和解析、form表單資料綁定和解析、URI資料綁定和解析、Query資料綁定和解析四種。四種資料綁定和解析方式涵蓋了HTTP請求的資料處理。下面為大家分别介紹下這四種資料綁定和解析方式。

一、JSON資料綁定和解析。

JSON資料綁定和解析指前端請求後端接口請求Content-Type為application/json類型,請求Body為JSON資料綁定到後端實體。

1.1 前端請求資料

{
    "uname": "sdgasdgsadgdsg",
    "sex": "male",
    "province": "河北",
    "likes": ["旅遊", "跑步"]
}
           

1.2 前端請求頭資訊

Content-Type:application/json

1.3 後端資料綁定

var _daoPost dao.Dao_Post
if err := c.ShouldBindJSON(&_daoPost); err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    return
}
pPost := page.Service_Page_Post{}
pPost.InsertPost(&_daoPost)           

1.4 後端資料解析

type Dao_Post struct {
    Id       int64
    UserName string   `json:"uname"`
    Sex      string   `json:"sex"`
    Likes    []string `json:"likes"`
    Province string   `json:"province"`
}           

二、表單資料綁定和解析

表單資料綁定和解析指前端請求的Form表單控件資料綁定到後端實體。

2.1 前端請求資料

<form name="gfrom" action="/admin/post" method="post" enctype="application/x-www-form-urlencoded">
  <div>姓名:<input type="text" name="uname"><div>
  <div>性别:<input name="sex" type="radio" value="male"><input name="sex" type="radio" value="female"><div>
  <div>愛好:<input type="checkbox" name="likes" value="旅遊" />旅遊  
    <input type="checkbox" name="likes" value="跑步" />跑步
    <input type="checkbox" name="likes" value="看書" />看書<div>
  <div>省份:<select name="province">
      <option value="河北">河北</option>
      <option value="陝西">陝西</option>
      <option value="北京">北京</option>
      <option value="天津">天津</option>
  </select>
  <div>
  <input type="submit" value="送出">
</form>           

2.2 後端資料綁定

var _daoPost dao.Dao_Post
if err := c.Bind(&_daoPost); err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    return
}
pPost := page.Service_Page_Post{}
pPost.InsertPost(&_daoPost)           

2.3 後端資料解析

type Dao_Post struct {
    Id       int64
    UserName string   `form:"uname"`
    Sex      string   `form:"sex"`
    Likes    []string `form:"likes"`
    Province string   `form:"province"`
}           

三、URI資料綁定和解析

URI資料綁定和解析指前端HTTP請求的URI中的資料綁定到後端實體

3.1 接口URI配置

/admin/post/:uname/:sex/:province/:likes

3.2 前端請求資料

http://localhost:8080/admin/post/sdgasgs3/male/河北/["旅遊","跑步"]

3.3 後端資料綁定

var _daoPost dao.Dao_Post
if err := c.BindUri(&_daoPost); err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    return
}
var _arrLikes []string
json.Unmarshal([]byte(_daoPost.Likes[0]), &_arrLikes)
_daoPost.Likes = _arrLikes
pPost := page.Service_Page_Post{}
pPost.InsertPost(&_daoPost)           

3.4 後端資料解析

type Dao_Post struct {
    Id       int64
    UserName string   `uri:"uname"`
    Sex      string   `uri:"sex"`
    Likes    []string `uri:"likes"`
    Province string   `uri:"province"`
}           

四、Query資料綁定和解析

Query資料綁定和解析指前端HTTP請求URL後面的GET參數資料綁定到後端實體。

4.1 前端請求資料

http://localhost:8080/admin/post?uname=sdgasgs3&sex=male&province=河北&likes=旅遊&likes=書法

4.2 後端資料綁定

var _daoPost dao.Dao_Post
if err := c.BindQuery(&_daoPost); err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    return
}
pPost := page.Service_Page_Post{}
pPost.InsertPost(&_daoPost)           

4.3 後端資料解析

type Dao_Post struct {
    Id       int64
    UserName string   `form:"uname"`
    Sex      string   `form:"sex"`
    Likes    []string `form:"likes"`
    Province string   `form:"province"`
}           

五、疑問總結

5.1 實體如果定義為[]string字元串數組,調用gorm Insert方法會報不支援[]string操作。解決辦法兩種:

  • []string數組的實體字段定義改為string類型。前端将數組參數值轉為json或約定的資料格式傳輸。
var _arrLikes []string
json.Unmarshal([]byte(_daoPost.Likes[0]), &_arrLikes)
_daoPost.Likes = _arrLikes

_daoDbPost.Id = _daoPost.Id
_daoDbPost.UserName = _daoPost.UserName
_daoDbPost.Sex = _daoPost.Sex
_daoDbPost.Province = _daoPost.Province
_likes, _ := json.Marshal(_daoPost.Likes)
_daoDbPost.Likes = string(_likes)

pPost := page.Service_Page_Post{}
pPost.InsertPost(&_daoDbPost)           
  • 多定義一個實體專門用于資料庫的操作。操作前将前端實體指派給資料庫實體。
type Dao_DB_Post struct {
    Id       int64
    UserName string
    Sex      string
    Province string
    Likes    string
}           

兩種方法是目前自己能想到的辦法但總體感覺不夠完美,大家有什麼更好的方法可以發評論回複。謝謝!

感謝大家的評論、點贊、分享、關注。。。