GO语言(十三)使用Go和Gin开发RESTfulAPI(下)
编写处理程序以添加新项目
当客户端在 发出POST请求时/albums,您希望将请求正文中描述的专辑添加到现有专辑数据中。
为此,您将编写以下内容: 将新专辑添加到现有列表的逻辑。 将请求路由POST到您的逻辑的一些代码。
1、编写代码
a.添加代码以将专辑数据添加到专辑列表。
在语句之后的某处import,粘贴以下代码。(文件末尾是这段代码的好地方,但 Go 并不强制你声明函数的顺序。) // postAlbums adds an album from JSON received in the request body. func postAlbums(c *gin.Context) { var newAlbum album // Call BindJSON to bind the received JSON to // newAlbum. if err := c.BindJSON(&newAlbum); err != nil { return } // Add the new album to the slice. albums = append(albums, newAlbum) c.IndentedJSON(http.StatusCreated, newAlbum) }
在此代码中:
1)用于Context.BindJSON 将请求正文绑定到newAlbum。
2)album将从 JSON 初始化的结构附加到albums 切片。
3)向响应添加201状态代码,以及表示您添加的专辑的 JSON。
b.更改您的main函数,使其包含该router.POST函数,如下所示。 func main() { router := gin.Default() router.GET("/albums", getAlbums) router.POST("/albums", postAlbums) router.Run("localhost:8080") }
在此代码中:
1)将路径中的POST方法与 /albumspostAlbums函数相关联。
使用 Gin,您可以将处理程序与 HTTP 方法和路径组合相关联。这样,您可以根据客户端使用的方法将发送到单个路径的请求单独路由。
2、运行代码
a.如果服务器从上一节开始仍在运行,请停止它。
b.从包含 main.go 的目录中的命令行,运行代码。 $ go run .
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。 $ curl http://localhost:8080/albums --include --header "Content-Type: application/json" --request "POST" --data "{"id": "4","title": "The Modern Sound of Betty Carter","artist": "Betty Carter","price": 49.99}"
该命令应显示添加专辑的标题和 JSON。 HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Date: Wed, 02 Jun 2021 00:34:12 GMT Content-Length: 116 { "id": "4", "title": "The Modern Sound of Betty Carter", "artist": "Betty Carter", "price": 49.99 }
d.与上一节一样,使用curl检索完整的专辑列表,您可以使用它来确认添加了新专辑。 $ curl http://localhost:8080/albums --header "Content-Type: application/json" --request "GET"
该命令应显示专辑列表。 [ { "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 }, { "id": "4", "title": "The Modern Sound of Betty Carter", "artist": "Betty Carter", "price": 49.99 } ]
编写处理程序以返回特定项目
当客户端向 发出请求时GET /albums/[id],您希望返回 ID 与id路径参数匹配的专辑。
为此,您将: 添加逻辑以检索请求的相册。 将路径映射到逻辑。
1、编写代码
a.在您在上一节中添加的函数下方postAlbums,粘贴以下代码以检索特定专辑。
此getAlbumByID函数将提取请求路径中的 ID,然后找到匹配的专辑。 // getAlbumByID locates the album whose ID value matches the id // parameter sent by the client, then returns that album as a response. func getAlbumByID(c *gin.Context) { id := c.Param("id") // Loop over the list of albums, looking for // an album whose ID value matches the parameter. for _, a := range albums { if a.ID == id { c.IndentedJSON(http.StatusOK, a) return } } c.IndentedJSON(http.StatusNotFound, gin.H{"message": "album not found"}) }
在此代码中:
(1)Context.Param用于从 URL 中检索id路径参数。当您将此处理程序映射到路径时,您将在路径中包含参数的占位符。
(2)循环album切片中的结构,寻找其ID 字段值与id参数值匹配的结构。如果找到,则将该album结构序列化为 JSON,并将其作为带有200 OK HTTP 代码的响应返回。
如上所述,实际使用中的服务可能会使用数据库查询来执行此查找。
(3)如果找不到专辑,则返回 HTTP 404错误。
b.最后,更改您的main,使其包含对router.GET的新调用,路径现在为/albums/:id ,如以下示例所示。 func main() { router := gin.Default() router.GET("/albums", getAlbums) router.GET("/albums/:id", getAlbumByID) router.POST("/albums", postAlbums) router.Run("localhost:8080") }
在此代码中:
(1)将/albums/:id路径与getAlbumByID功能相关联。在 Gin 中,路径中项目前面的冒号表示该项目是路径参数。
2、运行代码
a.如果服务器从上一节开始仍在运行,请停止它。
b.在包含 main.go 的目录中的命令行中,运行代码以启动服务器。 $ go run .
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。 $ curl http://localhost:8080/albums/2
该命令应显示您使用其 ID 的专辑的 JSON。如果找不到专辑,您将收到带有错误消息的 JSON。 { "id": "2", "title": "Jeru", "artist": "Gerry Mulligan", "price": 17.99 }
结论
恭喜!您刚刚使用 Go 和 Gin 编写了一个简单的 RESTful Web 服务。
完成的代码
本节包含您使用本教程构建的应用程序的代码。 package main import ( "net/http" "github.com/gin-gonic/gin" ) // album represents data about a record album. type album struct { ID string `json:"id"` Title string `json:"title"` Artist string `json:"artist"` Price float64 `json:"price"` } // albums slice to seed record album data. 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}, } func main() { router := gin.Default() router.GET("/albums", getAlbums) router.GET("/albums/:id", getAlbumByID) router.POST("/albums", postAlbums) router.Run("localhost:8080") } // getAlbums responds with the list of all albums as JSON. func getAlbums(c *gin.Context) { c.IndentedJSON(http.StatusOK, albums) } // postAlbums adds an album from JSON received in the request body. func postAlbums(c *gin.Context) { var newAlbum album // Call BindJSON to bind the received JSON to // newAlbum. if err := c.BindJSON(&newAlbum); err != nil { return } // Add the new album to the slice. albums = append(albums, newAlbum) c.IndentedJSON(http.StatusCreated, newAlbum) } // getAlbumByID locates the album whose ID value matches the id // parameter sent by the client, then returns that album as a response. func getAlbumByID(c *gin.Context) { id := c.Param("id") // Loop through the list of albums, looking for // an album whose ID value matches the parameter. for _, a := range albums { if a.ID == id { c.IndentedJSON(http.StatusOK, a) return } } c.IndentedJSON(http.StatusNotFound, gin.H{"message": "album not found"}) }
中国体彩和福彩为什么不设立官方app,在软件上购买彩票?几年前是有其他软件代买的,有那么两三年可以,然后突然就给停了,一点是网上不安全,大神的各种骚操作控制不住,或者你花了钱人家不一定给你买了(骗钱虚假操作)或者你中奖了被别人冒领了,第
vivo和iQOO有什么区别,这两款该怎么选择呢?iQOO是vivo孵化的全新子品牌。iQOO品牌的命名源自IQuestOnandOn,寓意着追求不止进击不止的品牌内涵。同时,iQOO的品牌主张为生而强悍,体现了iQOO对极致性能
元宇宙时代,腾讯可能仍是老大今年开始,元宇宙这个词成为新的风口。国外有Facebook改名meta进军元宇宙,国内各大公司也是纷纷表态在做相关准备,怕自己错失这个新的风口。口炮者有之,行动者有之,但好像只有腾
非985211大学的计算机系本科生进不了腾讯网易和百度这些公司工作吗?任何事情都是变化的,其他学校毕业的应届生也可以到腾讯网易和百度公司去工作不过相对来说,学历不是211985的计算机系的本科生,要想直接进入腾讯网易和百度基本上是比登天还难因为现在的
AppleWatch再次因拯救生命的干预措施而受到赞誉据AppleInsider报道,一块AppleWatch多次提醒一名女性她的心率过低,导致她多次到医院就诊并安装心脏起搏器。PattiSohn联系了在圣路易斯的当地新闻团队KMOV
什么是区块链?什么是区块链?区块链是一种数据库。区块链技术应用是银行及很高大上的公司,不是小商小贩。区块链服务器是由研究区块链技术的团队推出的安装好数据库应用的服务器,按协议卖给应用单位的。随着
联想集团为什么至今没有任何回复?不好回答,很难掌握分寸。因为所有的问诘依据是联想自己的公开资料,很难不打脸。不敢回答,意识到了社会潮流。因为近期社会上逐步涌现一股反对经济寡头,打倒金融买办的思潮,生怕被推倒浪尖上
为什么苹果手机通话的时候不能录音?这个问题对苹果来说在技术上实现很简单,苹果自我标榜为尊重客户隐私,但苹果商店有可以通话录音的APP,就是要收费,你说苹果打脸不打脸,这反映了苹果公司既想当,又想立,同时还有大家说的
互联网体育风云5小米出大招9秒83,再掀体育狂潮小米集团在看到阿里巴巴因为体育而产生巨大流量的时候,已经开始慢慢的打造自己在体育方面的产品了。本来还没想着要投入那么多的资源,只是想跟紧其他的互联网巨头走一步见一步,但是现在既然看
马斯克再出售超93万股特斯拉股票,本月已卖出916万股11月24日,据美国证交会文件显示,特斯拉CEO马斯克于11月23日以6。24美元的价格行使2152681份期权,同一日,马斯克总计通过105笔交易出售了934,091股股票,此次
中国人现在对联想的怨气为什么这么大?原因可能是多方面的,但人们主要还是关注其中的利益问题。一上世纪九十年代,中国的企业改制前,都是国有企业或集体企业,人们关注在改制过程中,是否存在损公肥私现象。二这些企业的改制,靠的