網站首頁 編程語言 正文
今天學習下Go語言如何集成Gin框架編寫Restful Web API的基本操作。Gin框架簡化了Go原生語言構建Web應用程序的復雜度,在今天的學習中,將學會使用Gin構建路由請求、數據檢索、JSON響應封裝等最簡單的Web服務。
基本要求
- Go 1.16 及更高版本
- 合適的編譯工具 - text編輯器也滿足要求
- 命令終端 - Linux、Mac系統shell, Windows系統的Cmd、PowerShell
- curl 工具 - curl 是一個利用URL語法在命令行下工作的文件傳輸工具
設計API
遵循Restful API 架構風格,構建以下兩個Http Api:
- /albums
- GET - 獲取數據列表,以JSON格式返回
- POST - 接收客戶端發送的JSON請求,新增數據項
- /albums/:id
- GET - 根據指定ID獲取特定的數據,跟SpringBoot框架動態ID使用 {id} 不同,Gin框架在語法上使用 冒號: 表明該參數為為前端傳遞的動態參數
代碼開發
創建項目
創建項目目錄
$ mkdir web-service-gin $ cd web-service-gin
項目初始化 - 使用go mod init 命令初始化
$ go mod init example/web-service-gin
該命令會自動創建go.mod文件,該文件用于管理Go應用中的依賴,作用類似于Java語言中的Maven
創建數據格式
為了簡化Demo開發難度,將直接使用內存中的數據,不跟DB進行交互(真實項目中不推薦)。首先在項目根目錄下創建main.go文件,文件內容如下:
package main// 定義JSON 返回格式type album struct { ID string `json:"id"` Title string `json:"title"` Artist string `json:"artist"` Price float64 `json:"price"`}// 內存中存儲的數組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},}
Restful API
返回數據列表
當客戶端使用Get方式請求**/albums**路徑時,需要按照JSON格式返回所有數據(這里先不討論分頁)。實現該需求,代碼開發時,需要注意以下兩點
- 準備響應邏輯
- 將請求路徑跟響應邏輯進行匹配
處理函數
// 在main.go新增函數 // getAlbums responds with the list of all albums as JSON. func getAlbums(c *gin.Context) { c.IndentedJSON(http.StatusOK, albums) }
代碼說明:
編寫getAlbums函數,該函數接受gin.Context參數。您可以為該函數指定任何你喜歡的函數名稱。gin.Context是Gin框架中最重要的部分,它攜帶HTTP Request請求的所有細節,如請求參數、驗證、JSON序列化等
調用Context.IndedJSON將結構序列化為JSON并將其添加到響應中。Context.IndedJSON函數的第一個參數是要發送給客戶端的HTTP狀態代碼。在這里默認為200,表示請求成功
**路由處理 **
// 在 main.go 文件中新增 func main() { router := gin.Default() router.GET("/albums", getAlbums) router.Run("localhost:8080") }
代碼說明
- 使用默認方式初始化Gin Router路由
- 使用GET方法關聯**/albums** 和?getAlbums?函數
- 調用Run函數啟動服務器
新增依賴
// 在 main.go 文件中新增 package main import ( "net/http" "github.com/gin-gonic/gin" )
運行服務
添加依賴 - 使用以下命令 拉取Gin框架依賴包
$ go get .
運行服務
$ go run .
使用curl工具發送Http請求 - 打開另外的終端發送請求
curl http://localhost:8080/albums
新增數據項
使用同樣的方式,在服務器端編寫POST請求接收客戶端數據新增數據項。跟之前Get請求稍微不同的是,該請求需要從request對象中解析出Body信息
處理函數
// postAlbums adds an album from JSON received in the request body. func postAlbums(c *gin.Context) { var newAlbum album // 調用BindJSON方法將數據解析到 newAlbum變量中 if err := c.BindJSON(&newAlbum); err != nil { return } // 將數據追加到內存數組中 albums = append(albums, newAlbum) c.IndentedJSON(http.StatusCreated, newAlbum) }
路由處理
func main() { router := gin.Default() router.GET("/albums", getAlbums) router.POST("/albums", postAlbums) router.Run("localhost:8080") }
運行服務
$ go run .
發送客戶端請求
$ 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}'
此時,在調用獲取數據列表的接口,必須返回4個數據了
返回指定數據
當客戶端以GET請求方式調用 **/albums/[id]**路徑,服務端需要返回指定ID的數據詳情。此時該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"}) }
路由匹配
func main() { router := gin.Default() router.GET("/albums", getAlbums) router.GET("/albums/:id", getAlbumByID) router.POST("/albums", postAlbums) router.Run("localhost:8080") }
運行服務
$ go run .
客戶端請求
$ curl http://localhost:8080/albums/2
完整代碼
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 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 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"}) } func main() { router := gin.Default() router.GET("/albums", getAlbums) router.POST("/albums", postAlbums) router.GET("/albums/:id", getAlbumByID) router.Run("localhost:8080") }
原文鏈接:https://blog.csdn.net/u013433591/article/details/128773125
相關推薦
- 2022-05-18 Python中的turtle畫箭頭,矩形,五角星_python
- 2022-09-24 Go?iota關鍵字與枚舉類型實現原理_Golang
- 2022-07-14 實現一個random?shuffle算法示例_C 語言
- 2022-06-17 Ruby操作CSV格式數據方法詳解_ruby專題
- 2022-09-27 阿里云官方Redis開發規范總結_Redis
- 2022-08-02 C#中DateTime函數的詳細用法_C#教程
- 2022-05-21 Python集合set()使用的方法詳解_python
- 2022-06-14 ASP.NET?Core?MVC中的標簽助手(TagHelper)用法_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支