跟著官網(wǎng)學(xué)Go之基于Gin開發(fā)一個(gè)簡(jiǎn)單的RESTful API
前面已經(jīng)將Go1.17.6安裝好了,這一小節(jié),繼續(xù)跟著官網(wǎng)學(xué)習(xí)基于Gin開發(fā)RESTful API
環(huán)境準(zhǔn)備
這里,我在E盤新建一個(gè)名為ginrest的文件夾,然后用vscode打開該文件夾,繼續(xù)使用cmd命令進(jìn)入到E:\ginrest文件夾,然后執(zhí)行g(shù)o mod init命令
此時(shí),在該文件夾下會(huì)生成一個(gè)名為go.mod的文件
新建main.go
前面基礎(chǔ)準(zhǔn)備好后,我們就需要準(zhǔn)備程序該有的入口,那便是新建一個(gè)main.go文件,
在該文件中加入包名package main
我繼續(xù)新建一個(gè)名為album的struct,go中的struct類似于C#中的類,在Go中,定義一個(gè)struct的標(biāo)準(zhǔn)格式如下
type 名 struct{
字段名 字段類型
}
我們?cè)谠搒truct中加入一些字段屬性
type album struct {
Id string `json:"id"`
Title string `json:"title"`
Artist string `json:"artist"`
Price float64 `json:"price"`
}
我們可以看到類型后面用json標(biāo)識(shí)了別名,其主要作用則是當(dāng)該struct序列化成json時(shí),會(huì)序列化為該別名,如果沒有別名則按屬性名展示。
我新建一個(gè)album的數(shù)組,主要是為后續(xù)數(shù)據(jù)讀取做準(zhǔn)備
var albums = []album{
{Id: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99},
{Id: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99},
{Id: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99},
}
使用Gin
前面把基礎(chǔ)的準(zhǔn)備工作已經(jīng)做好了,現(xiàn)在便是進(jìn)入主題,開始使用Gin,引入Gin包,現(xiàn)在main.go中使用import導(dǎo)入包并編寫main方法,在main方法中使用gin創(chuàng)建一個(gè)簡(jiǎn)單的Http服務(wù)器
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
router.Run("0.0.0.0:8080")
}
這里是0.0.0.0:8080是監(jiān)聽本機(jī)的8080端口,其實(shí)也可以直接使用:8080,如:router.Run(":8080"),端口號(hào)可以自行調(diào)整,如果不指定,默認(rèn)端口號(hào)也是8080。此時(shí)通過cmd執(zhí)行g(shù)o get .來下載gin的依賴包,這是不是類似.Net里面的Nuget包管理呢?
依賴包下載完成后,此時(shí),我們的go.mod文件便會(huì)新增一來記錄,并且會(huì)多出一個(gè)go.sum的文件,它為我們記錄了依賴包版本信息。
此時(shí),我們的程序就可以運(yùn)行了,
這時(shí),我們?cè)L問一下8080端口,服務(wù)端會(huì)返回404 page not found,那是因?yàn)槲覀儸F(xiàn)在什么都還沒有做,
我們繼續(xù)來分別實(shí)現(xiàn)獲取(getAlbums)和添加(postAlbums)兩個(gè)方法,Go語言中的方法和C#有些差別,
C#中大概就是這樣子
public List<Albums> GetAlbums(){
}
Go中需要func關(guān)鍵字來申明,下面就跟著官網(wǎng)的例子繼續(xù)寫
func getAlbums(c *gin.Context) {
c.IndentedJSON(http.StatusOK, albums)
}
func postAlbums(c *gin.Context) {
var newAlbum album
if err := c.BindJSON(&newAlbum); err != nil {
return
}
albums = append(albums, newAlbum)
c.IndentedJSON(http.StatusCreated, newAlbum)
}
接下來就是將方法注冊(cè)到Gin的路由中
router.GET("/albums", getAlbums)
router.POST("/albums", postAlbums)
這里的注冊(cè)的路由路徑都是/albums,通過Get和Post這兩種請(qǐng)求方式來區(qū)分不同的邏輯
現(xiàn)在運(yùn)行起來后,在瀏覽器訪問
http://localhost:8080/albums便能正常返回?cái)?shù)據(jù)
接下來,使用postman發(fā)起post請(qǐng)求,當(dāng)服務(wù)端接受到請(qǐng)求后,會(huì)將提交的數(shù)據(jù)追加到數(shù)組中
這里只是使用Gin來實(shí)現(xiàn)簡(jiǎn)單的Get和Post,就從這個(gè)簡(jiǎn)單的示例中,我們可以感受到它的靈活和簡(jiǎn)潔,后面我們?cè)倮^續(xù)跟進(jìn)學(xué)習(xí),最好是結(jié)合實(shí)際例子來做些小應(yīng)用。