コンテンツにスキップ

JSONP

JSONP(JSON with Padding)は、CORSサポート以前のブラウザからクロスドメインリクエストを行うための手法です。JSONレスポンスをJavaScript関数呼び出しでラップすることで機能します。ブラウザは同一オリジンポリシーの対象外である<script>タグ経由でレスポンスを読み込み、ラッピング関数がデータを引数として実行されます。

c.JSONP()を呼び出すと、Ginはcallbackクエリパラメータをチェックします。存在する場合、レスポンスボディはcallbackName({"foo":"bar"})としてラップされ、Content-Typeapplication/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レスポンスの違いを確認します:

Terminal window
# コールバックあり -- JavaScriptを返す
curl "http://localhost:8080/JSONP?callback=handleData"
# 出力: handleData({"foo":"bar"});
# コールバックなし -- プレーンJSONを返す
curl "http://localhost:8080/JSONP"
# 出力: {"foo":"bar"}

関連項目