最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang使用Gin創(chuàng)建Restful API的實現(xiàn)

 更新時間:2023年01月28日 09:09:55   作者:u013433591  
本文主要介紹了Golang使用Gin創(chuàng)建Restful API的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

今天學習下Go語言如何集成Gin框架編寫Restful Web API的基本操作。Gin框架簡化了Go原生語言構(gòu)建Web應(yīng)用程序的復(fù)雜度,在今天的學習中,將學會使用Gin構(gòu)建路由請求、數(shù)據(jù)檢索、JSON響應(yīng)封裝等最簡單的Web服務(wù)。

基本要求

  • Go 1.16 及更高版本
  • 合適的編譯工具 - text編輯器也滿足要求
  • 命令終端 - Linux、Mac系統(tǒng)shell, Windows系統(tǒng)的Cmd、PowerShell
  • curl 工具 - curl 是一個利用URL語法在命令行下工作的文件傳輸工具

設(shè)計API

遵循Restful API 架構(gòu)風格,構(gòu)建以下兩個Http Api:

  • /albums
  • GET - 獲取數(shù)據(jù)列表,以JSON格式返回
  • POST - 接收客戶端發(fā)送的JSON請求,新增數(shù)據(jù)項
  • /albums/:id
    • GET - 根據(jù)指定ID獲取特定的數(shù)據(jù),跟SpringBoot框架動態(tài)ID使用 {id} 不同,Gin框架在語法上使用 冒號: 表明該參數(shù)為為前端傳遞的動態(tài)參數(shù)

代碼開發(fā)

創(chuàng)建項目

創(chuàng)建項目目錄

$ mkdir web-service-gin
$ cd web-service-gin

項目初始化 - 使用go mod init 命令初始化

$ go mod init example/web-service-gin

該命令會自動創(chuàng)建go.mod文件,該文件用于管理Go應(yīng)用中的依賴,作用類似于Java語言中的Maven

創(chuàng)建數(shù)據(jù)格式

為了簡化Demo開發(fā)難度,將直接使用內(nèi)存中的數(shù)據(jù),不跟DB進行交互(真實項目中不推薦)。首先在項目根目錄下創(chuàng)建main.go文件,文件內(nèi)容如下:

package main// 定義JSON 返回格式type album struct {    ID     string  `json:"id"`    Title  string  `json:"title"`    Artist string  `json:"artist"`    Price  float64 `json:"price"`}// 內(nèi)存中存儲的數(shù)組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

返回數(shù)據(jù)列表

當客戶端使用Get方式請求**/albums**路徑時,需要按照JSON格式返回所有數(shù)據(jù)(這里先不討論分頁)。實現(xiàn)該需求,代碼開發(fā)時,需要注意以下兩點

  • 準備響應(yīng)邏輯
  • 將請求路徑跟響應(yīng)邏輯進行匹配

處理函數(shù)

// 在main.go新增函數(shù)
// getAlbums responds with the list of all albums as JSON.
func getAlbums(c *gin.Context) {
    c.IndentedJSON(http.StatusOK, albums)
}

代碼說明:

編寫getAlbums函數(shù),該函數(shù)接受gin.Context參數(shù)。您可以為該函數(shù)指定任何你喜歡的函數(shù)名稱。gin.Context是Gin框架中最重要的部分,它攜帶HTTP Request請求的所有細節(jié),如請求參數(shù)、驗證、JSON序列化等

調(diào)用Context.IndedJSON將結(jié)構(gòu)序列化為JSON并將其添加到響應(yīng)中。Context.IndedJSON函數(shù)的第一個參數(shù)是要發(fā)送給客戶端的HTTP狀態(tài)代碼。在這里默認為200,表示請求成功

**路由處理 **

// 在 main.go 文件中新增
func main() {
    router := gin.Default()
    router.GET("/albums", getAlbums)

    router.Run("localhost:8080")
}

代碼說明

  • 使用默認方式初始化Gin Router路由
  • 使用GET方法關(guān)聯(lián)**/albums** 和 getAlbums 函數(shù)
  • 調(diào)用Run函數(shù)啟動服務(wù)器

新增依賴

// 在 main.go 文件中新增
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

運行服務(wù)

添加依賴 - 使用以下命令 拉取Gin框架依賴包

$ go get .

運行服務(wù)

$ go run .

使用curl工具發(fā)送Http請求 - 打開另外的終端發(fā)送請求

curl http://localhost:8080/albums

新增數(shù)據(jù)項

使用同樣的方式,在服務(wù)器端編寫POST請求接收客戶端數(shù)據(jù)新增數(shù)據(jù)項。跟之前Get請求稍微不同的是,該請求需要從request對象中解析出Body信息

處理函數(shù)

// postAlbums adds an album from JSON received in the request body.
func postAlbums(c *gin.Context) {
    var newAlbum album

    // 調(diào)用BindJSON方法將數(shù)據(jù)解析到 newAlbum變量中
    if err := c.BindJSON(&newAlbum); err != nil {
        return
    }
    // 將數(shù)據(jù)追加到內(nèi)存數(shù)組中
    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")
}

運行服務(wù)

$ go run .

發(fā)送客戶端請求

$ 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}'

此時,在調(diào)用獲取數(shù)據(jù)列表的接口,必須返回4個數(shù)據(jù)了

返回指定數(shù)據(jù)

當客戶端以GET請求方式調(diào)用 **/albums/[id]**路徑,服務(wù)端需要返回指定ID的數(shù)據(jù)詳情。此時該ID是由客戶端動態(tài)指定的,接下來看看如何實現(xiàn)

處理函數(shù)

// 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")
}

運行服務(wù)

$ 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")
}

到此這篇關(guān)于Golang使用Gin創(chuàng)建Restful API的實現(xiàn)的文章就介紹到這了,更多相關(guān)Golang 創(chuàng)建Restful API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang并發(fā)下載多個文件的方法

    golang并發(fā)下載多個文件的方法

    今天小編就為大家分享一篇golang并發(fā)下載多個文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析

    如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析

    這篇文章主要為大家介紹了如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Go語言切片擴容原理和過程

    Go語言切片擴容原理和過程

    切片(Slice)在 Go 語言中,有一個很常用的數(shù)據(jù)結(jié)構(gòu),切片是一個擁有相同類型元素的可變長度的序列,它是基于數(shù)組類型做的一層封裝,它非常靈活,支持自動擴容,并發(fā)不安全,本文給大家介紹了Go 語言切片如何擴容,需要的朋友可以參考下
    2025-02-02
  • Go gRPC超時控制Deadlines用法詳解

    Go gRPC超時控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 一文初探Go語言中的reflect反射包

    一文初探Go語言中的reflect反射包

    這篇文章主要和大家分享一下Go語言中的reflect反射包,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • 關(guān)于golang中map使用的幾點注意事項總結(jié)(強烈推薦!)

    關(guān)于golang中map使用的幾點注意事項總結(jié)(強烈推薦!)

    map是一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點注意事項,需要的朋友可以參考下
    2023-01-01
  • Go語言之結(jié)構(gòu)體與方法

    Go語言之結(jié)構(gòu)體與方法

    這篇文章主要介紹了Go語言之結(jié)構(gòu)體與方法,結(jié)構(gòu)體是由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。下面我們就一起來學習什么是Go語言之結(jié)構(gòu)體
    2021-10-10
  • 一文帶你深入了解Golang中的參數(shù)傳遞機制

    一文帶你深入了解Golang中的參數(shù)傳遞機制

    值傳遞和引用傳遞是編程語言中兩種主要的參數(shù)傳遞方式,決定了函數(shù)調(diào)用過程中實參如何影響形參以及函數(shù)內(nèi)部對形參的修改是否會影響到原始實參,下面就跟隨小編一起深入了解下golang中參數(shù)傳遞機制吧
    2024-01-01
  • Go項目中添加生成時間與版本信息的方法

    Go項目中添加生成時間與版本信息的方法

    本文主要介紹了Go項目中添加生成時間與版本信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 深入理解Go語言中的閉包

    深入理解Go語言中的閉包

    Go函數(shù)是可以閉包的。閉包是一個函數(shù)值,他來自函數(shù)體外部的變量引用。 下面這篇文章通過一個demo來進行深入的介紹了Go語言中閉包的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考下。
    2017-03-03

最新評論

海宁市| 姜堰市| 吉安市| 手游| 大石桥市| 商都县| 清水河县| 嵊泗县| 丹棱县| 尼勒克县| 云霄县| 长沙县| 金门县| 磴口县| 宁陕县| 嵩明县| 贵港市| 丰城市| 晋城| 镇雄县| 威远县| 衡东县| 四平市| 喀什市| 临沂市| 黄大仙区| 巴青县| 博兴县| 巴林右旗| 巴塘县| 平舆县| 五寨县| 常德市| 霍城县| 通榆县| 阳东县| 民丰县| 霍州市| 太和县| 长垣县| 城固县|