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
}
兩種方法是目前自己能想到的辦法但總體感覺不夠完美,大家有什麼更好的方法可以發評論回複。謝謝!
感謝大家的評論、點贊、分享、關注。。。