JSONP
JSONP (JSON با Padding) تکنیکی برای ارسال درخواستهای بیندامنهای از مرورگرهایی است که قبل از پشتیبانی CORS بودند. این کار با بستهبندی پاسخ JSON در یک فراخوانی تابع JavaScript انجام میشود. مرورگر پاسخ را از طریق تگ <script> بارگذاری میکند که مشمول سیاست same-origin نیست و تابع بستهبندی با داده به عنوان آرگومان اجرا میشود.
وقتی c.JSONP() را فراخوانی میکنید، Gin پارامتر پرسوجوی callback را بررسی میکند. در صورت وجود، بدنه پاسخ به صورت callbackName({"foo":"bar"}) با Content-Type برابر application/javascript بستهبندی میشود. اگر callback ارائه نشود، پاسخ مانند فراخوانی استاندارد c.JSON() رفتار میکند.
package main
import ( "net/http"
"github.com/gin-gonic/gin")
func main() { router := gin.Default()
router.GET("/JSONP", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", }
// The callback name is read from the query string, e.g.: // GET /JSONP?callback=x // Will output : x({\"foo\":\"bar\"}) c.JSONP(http.StatusOK, data) })
// Listen and serve on 0.0.0.0:8080 router.Run(":8080")}با curl تست کنید تا تفاوت بین پاسخهای JSONP و JSON ساده را ببینید:
# With callback -- returns JavaScriptcurl "http://localhost:8080/JSONP?callback=handleData"# Output: handleData({"foo":"bar"});
# Without callback -- returns plain JSONcurl "http://localhost:8080/JSONP"# Output: {"foo":"bar"}