mrbardia72
mrbardia72
خواندن ۲ دقیقه·۴ سال پیش

Gin Web Framework part 6

Gin Web Framework part 6
Gin Web Framework part 6


درود دوستان امروز میخوام در مورد بخش شیش از سری مقالات فرم ورک Gin صحبت کنیم

فهرست بخش شیش از این مقاله

  • Bind Header
  • ProtoBuf rendering
  • SecureJSON
  • JSONP
  • AsciiJSON
  • PureJSON

میریم واسه توضیح هر بخش

قسمت اول 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\"})
or
curl 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, }) })



gogolangگوگولنگ
Go Developer(gopher-academy.ir)
شاید از این پست‌ها خوشتان بیاید