2010-07-21 108 views
28

據我所知,jsonp是一種繞過同一起源策略的技術。您基本上是在腳本標記中引用您的json服務服務器端點,因爲腳本標記不受SO策略的限制。JSONP是否需要修改服務器?

我的問題是:假設一個服務器有一個提供json的端點,服務器上是否需要修改以便在客戶端使用jsonp?

我覺得沒什麼,但要確保....

回答

33

沒錯,JSONP略有不同,當它呈現,讓您的服務器需要支持它。

JSON看起來是這樣的:

{ "name": "value" } 

而JSONP是這樣的:

functionName({ "name": "value" }); 

如果無論你使用它,你會覆蓋支持,但它是不一樣的只是支持JSON。當服務器收到一個請求,例如:http://example.com/json?callback=functionName,上面是你應該呈現什麼樣的,因爲它的外觀在頁面是這樣的:

<script type="text/javascript" src="http://example.com/json?callback=functionName"></script> 

這意味着運行需要返回的東西,作爲一個例證,這是有效的:

<script type="text/javascript"> 
    functionName({ "name": "value" }); 
</script> 

如果您的服務器沒有支持JSONP這將有效地是這樣的:

<script type="text/javascript"> 
    { "name": "value" } 
</script> 

...你會得到語法錯誤,因爲這不是有效的JavaScript。

+1

和你的js代碼必須實現functionName?是否需要評估json以獲取js對象? – hvgotcodes 2010-07-21 01:37:33

+0

@hvgotcodes - 是的,客戶端具有該功能(例如jQuery默認創建一個動態)。它是傳遞給函數的JSON(JSON是有效的對象文字符號,只是它的一個子集),所以不需要執行'eval()'。 – 2010-07-21 01:40:05

+1

我不明白你爲什麼不需要評估它。不管jsonp,大多數js庫都不會評估通過xhrs返回的json來獲取json代表的實際js對象嗎? – hvgotcodes 2010-07-21 01:44:01