溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang GinWeb框架之如何掌握XML/JSON/YAML/ProtoBuf等渲染

發(fā)布時間:2021-10-23 11:04:39 來源:億速云 閱讀:367 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“Golang GinWeb框架之如何掌握XML/JSON/YAML/ProtoBuf等渲染”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang GinWeb框架之如何掌握XML/JSON/YAML/ProtoBuf等渲染”吧!

XML,JSON,YAML,ProtoBuf等渲染

package main  import (   "github.com/gin-gonic/gin"   "github.com/gin-gonic/gin/testdata/protoexample"   "net/http" )  func main() {   r := gin.Default()    // gin.H is a shortcut for map[string]interface{}   // gin.H對象是一個map映射,鍵名為字符串類型, 鍵值是接口,所以可以傳遞所有的類型   r.GET("/someJSON", func(c *gin.Context) {     c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})   })    r.GET("/moreJSON", func(c *gin.Context) {     // You also can use a struct     var msg struct {       Name    string `json:"user"`       Message string       Number  int     }     msg.Name = "Lena"     msg.Message = "hey"     msg.Number = 123     // Note that msg.Name becomes "user" in the JSON     // Will output  :   {"user": "Lena", "Message": "hey", "Number": 123}      //JSON serializes the given struct as JSON into the response body. It also sets the Content-Type as "application/json".     //JSON方法將給定的結構序列化為JSON到響應體, 并設置內容類型Content-Type為:"application/json"     c.JSON(http.StatusOK, msg)   })    r.GET("/someXML", func(c *gin.Context) {     c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})   })    r.GET("/someYAML", func(c *gin.Context) {     c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})   })    //Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.   //Protocol buffers(簡稱ProtoBuf)是來自Google的一個跨語言,跨平臺,用于將結構化數(shù)據(jù)序列化的可擴展機制,   //詳見:https://developers.google.com/protocol-buffers   r.GET("/someProtoBuf", func(c *gin.Context) {     reps := []int64{int64(1), int64(2)}     label := "test"     // The specific definition of protobuf is written in the testdata/protoexample file.     // 使用protoexample.Test這個特別的protobuf結構來定義測試數(shù)據(jù)     data := &protoexample.Test{       Label: &label,       Reps:  reps,     }     // Note that data becomes binary data in the response  //將data序列化為二進制的響應數(shù)據(jù)     // Will output protoexample.Test protobuf serialized data     // ProtoBuf serializes the given struct as ProtoBuf into the response body.     // ProtoBuf方法將給定的結構序列化為ProtoBuf響應體     c.ProtoBuf(http.StatusOK, data)   })    // Listen and serve on 0.0.0.0:8080   r.Run(":8080") }  /* 模擬測試 curl http://localhost:8080/someJSON {"message":"hey","status":200}  curl http://localhost:8080/moreJSON {"user":"Lena","Message":"hey","Number":123}  curl http://localhost:8080/someXML <map><message>hey</message><status>200</status></map>  curl http://localhost:8080/someYAML message: hey status: 200  curl http://localhost:8080/someProtoBuf test */

安全的JSOn

使用SecureJSON方法保護Json不被劫持, 如果響應體是一個數(shù)組, 該方法會默認添加`while(1)`前綴到響應頭,  這樣的死循環(huán)可以防止后面的代碼被惡意執(zhí)行, 也可以自定義安全JSON的前綴.

package main  import (   "github.com/gin-gonic/gin"   "net/http" )  func main() {   r := gin.Default()    // You can also use your own secure json prefix   // 你也可以自定義安全Json的前綴   r.SecureJsonPrefix(")]}',\n")    //使用SecureJSON方法保護Json不被劫持, 如果響應體是一個數(shù)組, 該方法會默認添加`while(1)`前綴到響應頭,  這樣的死循環(huán)可以防止后面的代碼被惡意執(zhí)行, 也可以自定義安全JSON的前綴.   r.GET("/someJSON", func(c *gin.Context) {     names := []string{"lena", "austin", "foo"}      //names := map[string]string{     //  "hello": "world",     //}      // Will output  :   while(1);["lena","austin","foo"]     c.SecureJSON(http.StatusOK, names)   })    // Listen and serve on 0.0.0.0:8080   r.Run(":8080") }  /* 模擬請求:curl http://localhost:8080/someJSON )]}', ["lena","austin","foo"]% */

JSONP

使用JSONP可以實現(xiàn)跨域請求數(shù)據(jù), 如果請求中有查詢字符串參數(shù)callback, 則將返回數(shù)據(jù)作為參數(shù)傳遞給callback值(前端函數(shù)名),整體作為一個響應體,返回給前端.

JSONP是服務器與客戶端跨源通信的常用方法. 最大特點就是簡單適用, 老式瀏覽器全部支持, 服務器改造非常小, 它的基本思想是: 網(wǎng)頁通過添加一個<script>元素, 向服務器請求JSON數(shù)據(jù), 這種做法不受同源政策限制, 服務器收到請求后, 將數(shù)據(jù)放在一個指定名字的回調函數(shù)里傳回來, 這樣, 前端可以完成一次前端函數(shù)的調用, 而參數(shù)是后端返回的數(shù)據(jù).

注意: 這種方式存在被劫持的風險

package main  import (   "github.com/gin-gonic/gin"   "net/http" )  func main() {   r := gin.Default()    r.GET("/JSONP", func(c *gin.Context) {     data := gin.H{       "foo": "bar",     }      //callback is x     // Will output  :   x({\"foo\":\"bar\"})     // 使用JSONP可以實現(xiàn)跨域請求數(shù)據(jù), 如果請求中有查詢字符串參數(shù)callback, 則將返回數(shù)據(jù)作為參數(shù)傳遞給callback值(前端函數(shù)名),整體作為一個響應體,返回給前端     //JSONP是服務器與客戶端跨源通信的常用方法。最大特點就是簡單適用,老式瀏覽器全部支持,服務器改造非常小。     //它的基本思想是,網(wǎng)頁通過添加一個<script>元素,向服務器請求JSON數(shù)據(jù),這種做法不受同源政策限制;服務器收到請求后,將數(shù)據(jù)放在一個指定名字的回調函數(shù)里傳回來     c.JSONP(http.StatusOK, data)   })    // Listen and serve on 0.0.0.0:8080   r.Run(":8080")    // 模擬客戶端,請求參數(shù)中有callback參數(shù),值為x(前端函數(shù)名),最后響應內容為x("foo":"bar")   // curl http://127.0.0.1:8080/JSONP?callback=x }

AsciiJSON

使用ASCII編碼, 將非ASCII的字符進行轉義和編碼, 生成純ASCII編碼的JSON

package main  import (   "github.com/gin-gonic/gin"   "net/http" )  func main() {   r := gin.Default()    r.GET("/someJSON", func(c *gin.Context) {     data := gin.H{       "lang": "GO語言",       "tag":  "<br>",     }      // 輸出結果 : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}     // AsciiJSON方法返回帶有Unicode編碼和轉義組成的純ASCII字符串     c.AsciiJSON(http.StatusOK, data)   })    // Listen and serve on 0.0.0.0:8080   r.Run(":8080") }  /* 模擬請求:curl http://localhost:8080/someJSON  */

不帶轉義的原始JSON

通常, JSON會將特殊的HTML字符轉化為他們的unicode編碼, 如標簽`<`轉為`\u003c` 使用PureJSON方法可以得到原始不做轉義的字符串.

注意: 該方法至少需要Go版本1.6以上

package main  import "github.com/gin-gonic/gin"  func main() {   r := gin.Default()    // Serves unicode entities   r.GET("/json", func(c *gin.Context) {     c.JSON(200, gin.H{       "html": "<b>Hello, world!</b>",     })   })    // Serves literal characters   r.GET("/purejson", func(c *gin.Context) {     c.PureJSON(200, gin.H{       "html": "<b>Hello, world!</b>",     })   })    // listen and serve on 0.0.0.0:8080   r.Run(":8080") } /* 模擬請求,得到將HTML標簽轉義后的JSON字符串 curl http://localhost:8080/json {"html":"\u003cb\u003eHello, world!\u003c/b\u003e"}                                                                                                                                                                            得到原始JSON字符串 curl http://localhost:8080/purejson {"html":"<b>Hello, world!</b>"} */

感謝各位的閱讀,以上就是“Golang GinWeb框架之如何掌握XML/JSON/YAML/ProtoBuf等渲染”的內容了,經(jīng)過本文的學習后,相信大家對Golang GinWeb框架之如何掌握XML/JSON/YAML/ProtoBuf等渲染這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI