2012-01-31 32 views
4

我必須發送(並接收)某些數據到使用JQuery和JSON的服務器。 目前爲止工作,但不跨域,它必須是跨域。差異jsonp和簡單的獲取請求(跨域)

我看着如何解決這個問題,並找到JSONP。據我所見,使用JSONP我必須使用GET發送回調和數據(JQuery允許使用「POST」作爲方法,但是當我檢查Web流量時,我發現它實際上發送GET和everyting作爲參數)。

JSONP還需要在服務器中進行更改,因爲他們期待帶有JSON數據的POST請求,並且他們必須實現某些內容來處理JSONP GET請求。

所以我想知道這和發送數據作爲GET請求中的鍵值參數有什麼區別?

使用回調的可能性有所不同嗎?或者究竟是什麼?

對不起有點丟失...提前致謝

回答

5

JSONP不是表單提交。這是一種通過GET請求告訴服務器如何爲腳本標記生成內容的方式。返回的數據是JavaScript(不僅僅是JSON!)的一個有效載荷,它帶有一個函數調用,您可以按照約定在GET請求中引用該函數。

JSONP的工作原理是因爲它是一種不使用AJAX的黑客。這不是AJAX,你不應該爲此而混淆,因爲它在任何時候都使用XMLHttpRequest來發送數據,因爲它不是而是。這是它如何繞過同源政策。

根據您必須支持的瀏覽器,您可以在服務器端實現跨源資源共享標頭,這樣您就可以在可信域中使用正常的AJAX調用。大多數瀏覽器(IE8,Firefox3.5 +等)都支持CORS。

如果您不想使用CORS或JSONP,您可以使用的另一種解決方案是編寫一個PHP腳本或Java servlet,它將充當代理。這與從腳本打開新連接一樣簡單,將所有來自AJAX代碼的傳入參數複製到請求中,然後在腳本結尾處將響應轉儲回去。

+0

如果在服務器上添加標題很簡單,爲什麼每個人都用JSONP困擾?據我瞭解與JSONP也有必要在服務器進行更改 – Ixx 2012-01-31 13:05:38

+0

代理解決方案不適用於我的情況,因爲我需要該腳本可以在本地主機測試,並不是每個人在本地主機測試我的腳本是想安裝代理... – Ixx 2012-01-31 13:08:32

+0

好的,我在這裏http://www.json-p.org/找到了關於JSONP和CORS之間差異的解釋。看起來CORS不是「那麼簡單」 – Ixx 2012-01-31 13:19:45

2

我找到了一個解決跨域問題和JSON(而不是JSONP)的解決方案。 我只是用:

header('Access-Control-Allow-Origin: *'); 

我的JSON文件中(file.php),並把它稱爲是這樣的:

var serviceURL = 'http://your-domain.com/your/json/location.php' 
$.getJSON(serviceURL,function (data) { 
    var entries = data; 
    //do your stuff here using your entries in json 
}); 

BTW:這是一個接收過程中,不發送。

+0

我認爲這是CORS。這不完全是我要問的,但非常感謝你回答。 – Ixx 2012-02-01 15:51:17

+0

我已經使用jQuery Mobile將此解決方案實施到我的原生移動應用程序,並且它是由蘋果公司推出的。我所有的數據都是由存儲在服務器上的數據庫中的php文件生成的JSON格式。我一直在努力尋找一種適用於跨域腳本的解決方案,而不是將所有的JSON請求都改爲JSONP。 – aki 2012-02-02 08:23:15

+0

將標題腳本插入到我的php文件中就像魅力一樣,現在我可以通過互聯網請求我的json數據,甚至是移動本地應用程序。從我的角度來看,這是最好的解決方案,因爲我可以修改de php.json數據生成器不受SQL注入或其他攻擊的影響。如果你願意,我可以發佈一個php的例子來說明如何通過SQL回調保持安全性,並返回一個非常好的結構化JSON數據,你可以在任何地方使用(調用)! – aki 2012-02-02 08:24:06