Gin Web Framework part 6

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