درود دوستان امروز میخوام در مورد بخش شیش از سری مقالات فرم ورک Gin صحبت کنیم
فهرست بخش شیش از این مقاله
میریم واسه توضیح هر بخش
در این روش زمانی که شما می خواید داده ای رو به هدر خود اضافه کنید از این روش استفاده می کنید. به تکه کد زیر توجه کنید
type testHeader struct { Rate int `header:"Rate"` Domain string `header:"Domain"` } func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { h := testHeader{} if err := c.ShouldBindHeader(&h); err != nil { c.JSON(200, err) } fmt.Printf("%#v\n", h) c.JSON(200, gin.H{"Rate": h.Rate, "Domain": h.Domain}) })
توی خط اول ما یه struct تعریف کردیم و روبه روی هر فیلد از واژه header استغاده کردیم چون میخوام این فیلد ها رو توی هدر استفاده کنیم.
توی خط ۹ ما از تابع ShouldBindHeader استفاده می کنیم جهت بررسی هدر مون که توی struct تعریف کردیم
تست و خروجی:
curl -H "rate:300" -H "domain:music" 127.0.0.1:8080/
output {"Domain":"music","Rate":300}
توی این قسمت با یه ساختار دیگه به نام protobuf آشنا میشیم و نحوه کارش توی این فرم ورک خوب اگه در مورد این ساختار داده ای جدید چیزی نمی دونید باید بگم (البته ساده میگم بعد خودتون برید در موردش بخونید) یک ساختار داده ای هست که تمام داده های شما رو تبدیل به باینری می کند
نمونه کد
r.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "gopher" data := &protoexample.Test{ Label: &label, Reps: reps, } c.ProtoBuf(http.StatusOK, data) })
همانطور که مشاهد می کنید ما برای کار با این ساختار از تابعی به نام protobuf که در خط ۹ می باشد استفاده می کنیم.
استفاده از SecureJSON برای جلوگیری از json hijacking
اگر ساختار داده ای ما آرایه باشد ، پیش فرض "while (1)" را به بدن پاسخ اضافه می کند.
به کد زیر دقت کنید
func main() { r := gin.Default() r.SecureJsonPrefix(")]}',\n") r.GET("/someJSON", func(c *gin.Context) { names := []string{"bardia", "kazemi", "golang"} c.SecureJSON(http.StatusOK, names) } )}
ما برای این کار از SecureJsonPrefix که در خط ۳ هست استفاده کردیم
خروجی به صورت زیر
while(1);["bardia","kazemi","golang"]
در واقع JSONP (مخفف JSON with Padding – به معنی JSON به همراه padding) متدی برای ارسال داده های JSON است که مشکلات بین-دامنه ای را حل می کند.
به تکه کد زیر دقت کنید:
r.GET("/JSONP", func(c *gin.Context) { data := gin.H{ "bardia": "kazemi", } c.JSONP(http.StatusOK, data) }) }
خروجی به صورت زیر
curl http://127.0.0.1:8080/JSONP?callback=golang
golang({\"bardia\":\"kazemi\"})
or
curl http://127.0.0.1:8080/JSONP?callback=cplusplus
cplusplus({\"erfan\":\"kazemi\"})
توی خط ۳ ما از jsonp برای این کار استغاده کردیم. که خروجی گویای تعریف jsonp می باشد.
با استفاده از AsciiJSON ما می توانیم کارکتر های که کد اسکی ندارند رو تو خروجی چاپ و استغاده کنیم
کد زیر
r.GET("/someJSON", func(c *gin.Context) {
data := gin.H{
"lang": "GO语言",
"persian":"کوروش کبیر"
"tag": "<br>",
}
رمز نگاری کارکتری های خاص به کارکترهای بامعنی جهت استفاده در سند های html به صورت زیر
کد:
r.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "<b>Hello, gopher academy!</b>", }) })