2012-11-04 81 views
2

我有一個應用程序,我在Javascript中使用Phonegap編寫,它從我的服務器上的PHP腳本中檢索JSON編碼的字符串。跨域GET JSON編碼的字符串?

當它是一個跨域請求時,是否有可能從JavaScript中的PHP中檢索此JSON編碼的字符串?

我目前使用的是雅虎的YQL,它通過jQuery AJAX檢索字符串,但我不想依靠雅虎的服務,尤其是因爲它在正常運行時間方面非常糟糕。

+0

是一個GET請求,「從我的服務器上的PHP腳本JSON編碼字符串」加載你的?即你不能只使用jsonp嗎? – AD7six

+0

你確定phonegap是否爲跨域調用強制執行同源策略?我的理解是,他們沒有,因爲應用程序是通過「localhost – Alan

回答

3

跨域GET的,如果你自己的終點,我建議修改爲使用JSONP

因爲瀏覽器<script>標籤可以從不同的域加載腳本,它是解決跨域問題的一種方式,幾乎不用擔心跨瀏覽器支持。它確實會造成一些潛在的跨站腳本問題(我推薦閱讀上面鏈接的wiki頁面),您應該知道這些問題。

讓JSONP API調用是超級容易,如果你使用jQuery,但它自己動態注射<script>標籤,該src屬性設置爲你的API端點,並創建自己的回調函數仍然足夠簡單以嚴格的JavaScript來做到這一點調用成功後調用。

修改您的服務器端點以採用callback參數。用回調包裝你的json響應。

例如(非真實代碼)

//example api url 
//http://tempuri/apiendpoint?callback=foo 

//example url handler (not in PHP) 
app.get('/apiendpoint',function() { 
    return query.callback + '({"json": "value"});' 
}); 

如果您不想支持JSONP,則可以啓用跨源資源共享(CORS)。 iOS和Android瀏覽器都支持它。爲了增加對CORS支持,你需要修改端點發送相應的頭:

'Access-Control-Allow-Origin' 
'Access-Control-Allow-Methods' 
'Access-Control-Allow-Headers' 
+1

這真的是最簡單的解決方案。讓這個工作,按照這個指南(它幫助了我)http://www.fbloggs.com/2010/07/09/how-to-access-cross-domain-data-with-ajax-using-jsonp-jquery - 和 - PHP / – Charlie

0

有一個名爲ACD(AJAX Cross Domain)的Perl腳本,我過去使用得相當成功 - 請查看here。最好的部分是你不必依靠外部服務。

它的工作原理是這樣的:

<script type="text/javascript" src="http://my-domain.com/cgi-bin/ACD/ACD.js?uri=(http://www.google.com)"></script> 
<script type="text/javascript"> 
alert(ACD.responseText); //Should alert the source of google.com 
</script> 
+0

運行的Perl腳本運行在服務器端還是客戶端,儘管? – Charlie

+0

@Charlie服務器端 –