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

Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解

 更新時(shí)間:2023年05月16日 11:17:42   作者:富士康質(zhì)檢員張全蛋  
這篇文章主要介紹了Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果,我們都知道,一個(gè)完整的請(qǐng)求包含請(qǐng)求和處理請(qǐng)求以及結(jié)果返回三個(gè)步驟,在服務(wù)器端對(duì)請(qǐng)求處理完成以后,會(huì)將結(jié)果返回給客戶端,在gin框架中,支持返回多種請(qǐng)求數(shù)據(jù)格式,下面我們一起來(lái)看看

下面介紹返回類型如下:

  • [ ]byte和string
  • JSON格式
  • HTML模板渲染
  • 靜態(tài)資源設(shè)置

背景

在前面的課程中,我們已經(jīng)學(xué)習(xí)和掌握了多類型的網(wǎng)絡(luò)請(qǐng)求和處理,還掌握了提交數(shù)據(jù)與結(jié)構(gòu)體綁定的操作。我們都知道,一個(gè)完整的請(qǐng)求包含請(qǐng)求、處理請(qǐng)求和結(jié)果返回三個(gè)步驟,在服務(wù)器端對(duì)請(qǐng)求處理完成以后,會(huì)將結(jié)果返回給客戶端。

在gin框架中,支持返回多種請(qǐng)求數(shù)據(jù)格式。

[ ]byte

在之前的課程案例中,我們統(tǒng)一使用的請(qǐng)求返回?cái)?shù)據(jù)格式為[ ]byte。通過(guò)context,Writer,Write方法寫入[ ]byte數(shù)據(jù)。編碼案例如下所示:

package main
import "github.com/gin-gonic/gin"
func main() {
	engine := gin.Default()
	engine.GET("/byte", func(c *gin.Context) {
		fullPath := c.FullPath()
		c.Writer.Write([]byte(fullPath))
	})
	engine.Run()
}

string

engine.GET("/string", func(c *gin.Context) {
		fullPath := c.FullPath()
		c.Writer.WriteString(fullPath)
	})

這里writer是context結(jié)構(gòu)體里面的一個(gè)屬性,類型為ResponseWriter這樣一個(gè)類型。

type Context struct {
    writermem    responseWriter
    Request      *http.Request
    Writer       ResponseWriter
}

ResponseWriter是一個(gè)接口類型,在這個(gè)接口里面包括了http.ResponseWriter,這個(gè)也就是go標(biāo)準(zhǔn)庫(kù)http包下的,這里還有一系列的方法。上面使用的c.Writer方法是屬于http.ResponseWriter下的一個(gè)方法。

type ResponseWriter interface {
    http.ResponseWriter
    http.Hijacker
    http.Flusher
    http.CloseNotifier
    Status() int
    Size() int
    WriteString(string) (int, error)
    Written() bool
    WriteHeaderNow()
    Pusher() http.Pusher
}

JSON

除了使用context.Writer對(duì)象返回byte和string類型的數(shù)據(jù)意外。在項(xiàng)目開(kāi)發(fā)中,JSON格式規(guī)范使用的更為普遍。gin為了方便開(kāi)發(fā)者更方便的使用該框架進(jìn)行項(xiàng)目開(kāi)發(fā),直接支持將返回?cái)?shù)據(jù)組裝成JSON格式進(jìn)行返回。

gin框架中的context包含的JSON方法可以將結(jié)構(gòu)體類型的數(shù)據(jù)轉(zhuǎn)換成JSON格式的結(jié)構(gòu)化數(shù)據(jù),然后返回給客戶端。

下面是兩種方式來(lái)演示,一種是通過(guò)map類型數(shù)據(jù)轉(zhuǎn)化為json,其次還可以通過(guò)結(jié)構(gòu)體類型轉(zhuǎn)化為json格式。

map類型編程調(diào)用如下所示:

engine.GET("/map", func(c *gin.Context) {
		fullPath := c.FullPath()
		c.JSON(http.StatusOK, map[string]interface{}{
			"code": 1,
			"msg":  "ok",
			"data": fullPath,
		})
	})

這樣就完成了最簡(jiǎn)單的map類型的數(shù)據(jù)格式轉(zhuǎn)化為json,然后返回給前端。

struct類型編程調(diào)用如下所示:

真正項(xiàng)目開(kāi)發(fā)的時(shí)候,往往會(huì)有很多的結(jié)構(gòu)體,要將結(jié)構(gòu)體對(duì)應(yīng)值類型的數(shù)據(jù)直接返回給前端。

通常會(huì)將code,message和data這三個(gè)數(shù)據(jù)定義作為response這樣一個(gè)通用的結(jié)構(gòu)體。

package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func delStructHandler(c *gin.Context) {
	fullPath := "請(qǐng)求路徑" + c.FullPath()
	resp := Response{
		Code:    1,
		Message: "ok",
		Data:    fullPath,
	}
	c.JSON(http.StatusOK, &resp)
	//第二個(gè)參數(shù)是interface類型,這里需要取值類型的地址
}
type Response struct {
	Code    int
	Message string
	Data    interface{} //由于類型不確定,那么使用萬(wàn)能類型,interface類型
}
func main() {
	engine := gin.Default()
	engine.GET("/struct", delStructHandler)
	engine.Run()
}

Html

在gin框架當(dāng)中,支持直接加載html頁(yè)面,或者h(yuǎn)tml模板,這樣就可以在前端里面渲染出來(lái)。

這里要先創(chuàng)建html的目錄,目錄下面放的都是html文件,gin要去先加載這些文件才能使用。

package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func htmlHandler(c *gin.Context) {
	c.HTML(http.StatusOK, "index.html", nil)
	//第二個(gè)參數(shù)是interface類型,這里需要取值類型的地址
}
func main() {
	engine := gin.Default()
	//指明要加載的html文件所在的目錄,這樣就將html目錄下面所有的文件可以讓gin訪問(wèn)
	engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*")
	engine.GET("/html", htmlHandler)
	engine.Run()
}

在這個(gè)html頁(yè)面能不能將后臺(tái)的服務(wù)器的一些數(shù)據(jù)返回給html頁(yè)面呢?

這就需要使用模板語(yǔ)言,要將一個(gè)變量傳遞到index.html頁(yè)面中展示,這就需要在html頁(yè)面當(dāng)中使用模板語(yǔ)言來(lái)定義變量。雙花括號(hào)+變量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>gin學(xué)習(xí)</h1>
{{.fullPath}}
</body>
</html>

在這個(gè)頁(yè)面當(dāng)中定義了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.title}</title>
</head>
<body>
<h1>gin學(xué)習(xí)</h1>
{{.fullPath}}
</body>
</html>
package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func htmlHandler(c *gin.Context) {
	fullPath := c.FullPath()
	c.HTML(http.StatusOK, "index.html", gin.H{
		"fullPath": fullPath,
		"title":    "gin學(xué)習(xí)",
	})
	//這樣就將服務(wù)器端的變量傳遞到html頁(yè)面當(dāng)中了
}
func main() {
	engine := gin.Default()
	//指明要加載的html文件所在的目錄,這樣就將html目錄下面所有的文件可以讓gin訪問(wèn)
	engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*")
	engine.GET("/html", htmlHandler)
	engine.Run()
}

上面就是在html當(dāng)中使用模板語(yǔ)言進(jìn)行數(shù)據(jù)的傳遞和數(shù)據(jù)展示。

加載靜態(tài)圖片

在開(kāi)發(fā)的過(guò)程當(dāng)中往往會(huì)將同一類資源創(chuàng)建在同一個(gè)目錄下面。

gin框架要在加載靜態(tài)資源的時(shí)候必須先設(shè)置好靜態(tài)資源的目錄。

package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func htmlHandler(c *gin.Context) {
	fullPath := c.FullPath()
	c.HTML(http.StatusOK, "index.html", gin.H{
		"fullPath": fullPath,
		"title":    "gin學(xué)習(xí)",
	})
	//這樣就將服務(wù)器端的變量傳遞到html頁(yè)面當(dāng)中了
}
func main() {
	engine := gin.Default()
	//指明要加載的html文件所在的目錄,這樣就將html目錄下面所有的文件可以讓gin訪問(wèn)
	engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*")
	//第一個(gè)參數(shù)代表客戶端請(qǐng)求的http路徑,第二個(gè)參數(shù)表示本地工程的路徑
	engine.Static("/img", "../image")
	engine.GET("/html", htmlHandler)
	engine.Run()
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.title}}</title>
</head>
<body>
<h1>gin學(xué)習(xí)</h1>
{{.fullPath}}
<div align="center">
<img src="C:\Users\W10\GolandProjects\day1\gin\bilibli\image\test.jpg">
</div>
</body>
</html>

到此這篇關(guān)于Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解的文章就介紹到這了,更多相關(guān)Golang Gin多數(shù)據(jù)格式返回內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言實(shí)現(xiàn)AES加密并編寫一個(gè)命令行應(yīng)用程序

    Go語(yǔ)言實(shí)現(xiàn)AES加密并編寫一個(gè)命令行應(yīng)用程序

    密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是經(jīng)常采用的一種區(qū)塊加密標(biāo)準(zhǔn)。本文就來(lái)用Go語(yǔ)言實(shí)現(xiàn)AES加密算法,需要的可以參考一下
    2023-02-02
  • go語(yǔ)言程序cpu過(guò)高問(wèn)題排查的方法詳解

    go語(yǔ)言程序cpu過(guò)高問(wèn)題排查的方法詳解

    使用golang進(jìn)行復(fù)雜的組合運(yùn)算,導(dǎo)致CPU占用率非常高,下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言程序cpu過(guò)高問(wèn)題排查的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Go模板template用法詳解

    Go模板template用法詳解

    這篇文章主要介紹了Go標(biāo)準(zhǔn)庫(kù)template模板用法詳解;包括GO模板注釋,作用域,語(yǔ)法,函數(shù)等知識(shí),需要的朋友可以參考下
    2022-04-04
  • go語(yǔ)法入門匿名函數(shù)定義及使用示例詳解

    go語(yǔ)法入門匿名函數(shù)定義及使用示例詳解

    這篇文章主要為大家介紹了go語(yǔ)法入門匿名函數(shù)定義及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 利用go語(yǔ)言實(shí)現(xiàn)Git?重命名遠(yuǎn)程分支??

    利用go語(yǔ)言實(shí)現(xiàn)Git?重命名遠(yuǎn)程分支??

    這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)Git?重命名遠(yuǎn)程分支,文章基于go語(yǔ)言的基礎(chǔ)展開(kāi)Git?重命名遠(yuǎn)程分支的實(shí)現(xiàn)過(guò)程,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-06-06
  • go實(shí)現(xiàn)redigo的簡(jiǎn)單操作

    go實(shí)現(xiàn)redigo的簡(jiǎn)單操作

    golang操作redis主要有兩個(gè)庫(kù),go-redis和redigo,今天我們就一起來(lái)介紹一下redigo的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-07-07
  • Go timer如何調(diào)度

    Go timer如何調(diào)度

    本篇文章剖析下 Go 定時(shí)器的相關(guān)內(nèi)容。定時(shí)器不管是業(yè)務(wù)開(kāi)發(fā),還是基礎(chǔ)架構(gòu)開(kāi)發(fā),都是繞不過(guò)去的存在,由此可見(jiàn)定時(shí)器的重要程度,感興趣的可以了解一下
    2021-06-06
  • Golang中日志使用詳解

    Golang中日志使用詳解

    這篇文章記錄了Golang項(xiàng)目中日志使用,以及結(jié)合Gin框架記錄請(qǐng)求日志,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例

    Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例

    責(zé)任鏈?zhǔn)且环N行為設(shè)計(jì)模式, 允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送, 直至其中一個(gè)處理者對(duì)其進(jìn)行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-06-06
  • Golang中panic的異常處理

    Golang中panic的異常處理

    本文主要介紹了Golang中panic的異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

巢湖市| 乾安县| 股票| 从化市| 龙里县| 观塘区| 扎鲁特旗| 保靖县| 通渭县| 高密市| 远安县| 郓城县| 鄂温| 深圳市| 道真| 磐石市| 思南县| 深州市| 桓台县| 澄迈县| 巴楚县| 平潭县| 简阳市| 延长县| 隆尧县| 保定市| 甘孜县| 张家港市| 新竹县| 鹤壁市| 易门县| 安龙县| 广丰县| 安图县| 英超| 阿坝县| 文水县| 凌源市| 清水河县| 隆安县| 常熟市|