JSONP
JSONP(JSON with Padding)は、CORSサポート以前のブラウザからクロスドメインリクエストを行うための手法です。JSONレスポンスをJavaScript関数呼び出しでラップすることで機能します。ブラウザは同一オリジンポリシーの対象外である<script>タグ経由でレスポンスを読み込み、ラッピング関数がデータを引数として実行されます。
c.JSONP()を呼び出すと、Ginはcallbackクエリパラメータをチェックします。存在する場合、レスポンスボディはcallbackName({"foo":"bar"})としてラップされ、Content-Typeはapplication/javascriptになります。コールバックが提供されない場合、レスポンスは標準の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", }
// コールバック名はクエリ文字列から読み取られます。例: // GET /JSONP?callback=x // 出力: x({\"foo\":\"bar\"}) c.JSONP(http.StatusOK, data) })
// 0.0.0.0:8080でリッスンしてサーブ router.Run(":8080")}curlでテストして、JSONPとプレーンJSONレスポンスの違いを確認します:
# コールバックあり -- JavaScriptを返すcurl "http://localhost:8080/JSONP?callback=handleData"# 出力: handleData({"foo":"bar"});
# コールバックなし -- プレーンJSONを返すcurl "http://localhost:8080/JSONP"# 出力: {"foo":"bar"}