Golang Gin框架實現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解
下面介紹返回類型如下:
- [ ]byte和string
- JSON格式
- HTML模板渲染
- 靜態(tài)資源設(shè)置
背景
在前面的課程中,我們已經(jīng)學(xué)習(xí)和掌握了多類型的網(wǎng)絡(luò)請求和處理,還掌握了提交數(shù)據(jù)與結(jié)構(gòu)體綁定的操作。我們都知道,一個完整的請求包含請求、處理請求和結(jié)果返回三個步驟,在服務(wù)器端對請求處理完成以后,會將結(jié)果返回給客戶端。
在gin框架中,支持返回多種請求數(shù)據(jù)格式。
[ ]byte
在之前的課程案例中,我們統(tǒng)一使用的請求返回數(shù)據(jù)格式為[ ]byte。通過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)體里面的一個屬性,類型為ResponseWriter這樣一個類型。
type Context struct { writermem responseWriter Request *http.Request Writer ResponseWriter }
ResponseWriter是一個接口類型,在這個接口里面包括了http.ResponseWriter,這個也就是go標(biāo)準(zhǔn)庫http包下的,這里還有一系列的方法。上面使用的c.Writer方法是屬于http.ResponseWriter下的一個方法。
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對象返回byte和string類型的數(shù)據(jù)意外。在項目開發(fā)中,JSON格式規(guī)范使用的更為普遍。gin為了方便開發(fā)者更方便的使用該框架進行項目開發(fā),直接支持將返回數(shù)據(jù)組裝成JSON格式進行返回。
gin框架中的context包含的JSON方法可以將結(jié)構(gòu)體類型的數(shù)據(jù)轉(zhuǎn)換成JSON格式的結(jié)構(gòu)化數(shù)據(jù),然后返回給客戶端。
下面是兩種方式來演示,一種是通過map類型數(shù)據(jù)轉(zhuǎn)化為json,其次還可以通過結(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, }) })
這樣就完成了最簡單的map類型的數(shù)據(jù)格式轉(zhuǎn)化為json,然后返回給前端。
struct類型編程調(diào)用如下所示:
真正項目開發(fā)的時候,往往會有很多的結(jié)構(gòu)體,要將結(jié)構(gòu)體對應(yīng)值類型的數(shù)據(jù)直接返回給前端。
通常會將code,message和data這三個數(shù)據(jù)定義作為response這樣一個通用的結(jié)構(gòu)體。
package main import ( "github.com/gin-gonic/gin" "net/http" ) func delStructHandler(c *gin.Context) { fullPath := "請求路徑" + c.FullPath() resp := Response{ Code: 1, Message: "ok", Data: fullPath, } c.JSON(http.StatusOK, &resp) //第二個參數(shù)是interface類型,這里需要取值類型的地址 } type Response struct { Code int Message string Data interface{} //由于類型不確定,那么使用萬能類型,interface類型 } func main() { engine := gin.Default() engine.GET("/struct", delStructHandler) engine.Run() }
Html
在gin框架當(dāng)中,支持直接加載html頁面,或者h(yuǎn)tml模板,這樣就可以在前端里面渲染出來。
這里要先創(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) //第二個參數(shù)是interface類型,這里需要取值類型的地址 } func main() { engine := gin.Default() //指明要加載的html文件所在的目錄,這樣就將html目錄下面所有的文件可以讓gin訪問 engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*") engine.GET("/html", htmlHandler) engine.Run() }
在這個html頁面能不能將后臺的服務(wù)器的一些數(shù)據(jù)返回給html頁面呢?
這就需要使用模板語言,要將一個變量傳遞到index.html頁面中展示,這就需要在html頁面當(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>
在這個頁面當(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頁面當(dāng)中了 } func main() { engine := gin.Default() //指明要加載的html文件所在的目錄,這樣就將html目錄下面所有的文件可以讓gin訪問 engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*") engine.GET("/html", htmlHandler) engine.Run() }
上面就是在html當(dāng)中使用模板語言進行數(shù)據(jù)的傳遞和數(shù)據(jù)展示。
加載靜態(tài)圖片
在開發(fā)的過程當(dāng)中往往會將同一類資源創(chuàng)建在同一個目錄下面。
gin框架要在加載靜態(tài)資源的時候必須先設(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頁面當(dāng)中了 } func main() { engine := gin.Default() //指明要加載的html文件所在的目錄,這樣就將html目錄下面所有的文件可以讓gin訪問 engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*") //第一個參數(shù)代表客戶端請求的http路徑,第二個參數(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框架實現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解的文章就介紹到這了,更多相關(guān)Golang Gin多數(shù)據(jù)格式返回內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
goland?-sync/atomic原子操作小結(jié)
這篇文章主要介紹了goland?-sync/atomic原子操作,原子操作能夠保證執(zhí)行期間是連續(xù)且不會被中斷(變量不會被其他修改,mutex可能存在被其他修改的情況),本文給大家介紹的非常詳細(xì),需要的朋友參考下2022-08-08GO中?分組聲明與array,?slice,?map函數(shù)
這篇文章主要介紹了GO中?分組聲明與array,slice,map函數(shù),Go語言中,同時聲明多個常量、變量,或者導(dǎo)入多個包時,可采用分組的方式進行聲明,下面詳細(xì)介紹需要的小伙伴可以參考一下2022-03-03