2011-08-29 182 views
2

我正在嘗試使用jQuery的.AJAX函數向IPINFODB的API發送請求以獲取用戶訪問我們網站的地理位置。跨域jQuery .AJAX問題

問題是,從我可以收集的jQuery的.AJAX函數不允許跨域請求,並且不會返回任何內容。

下面的代碼提醒了[空白]

$.ajax({ 
    type: "POST", 
    url: "http://api.ipinfodb.com/v3/ip-city/ip_query.php", 
    data: "key=***********&format=json&ip=<?php echo $_SERVER['REMOTE_ADDR']; ?>", 
    success: function(r) { 

     alert(r); 

    } 
}); 

我已經試過所有的參數變化對阿賈克斯的請求,如GET,JSON,等等等等,但仍然一無所獲。有誰知道通過AJAX向這個API發出請求的另一種方式嗎?最好不要使用YQL。

+0

:) 5答案,沒有投票,沒有正確的答案標記... – Ross

回答

3

這可以用AJAX來完成。您將需要使用JSONP來解決跨域問題。

下面是代碼:

$.getJSON("http://api.ipinfodb.com/v3/ip-city/?key=API_KEY&format=json&callback=?") 
.error (function () { 
    // error code 
}) 
.success(function (result) { 
    // success code 
    console.log(result); 
    console.log("your location is", result.latitude, result.longitude); 
}); 

您將需要使用自己的API密鑰更換API_KEY

0

如果遠程服務器不支持JSONP,由於same origin policy限制,你不能直接從JavaScript調用它(除非你編寫自己的瀏覽器和JavaScript的實現不尊重這個政策)。

要解決此限制,您可以在您的域中編寫一個服務器端腳本,該腳本將充當您的域和遠程域(api.ipinfodb.com)之間的橋樑,然後將AJAX請求發送到您自己的服務器端腳本。

+0

好的,謝謝,我只是有一個快速瀏覽這個,並會嘗試服務器端腳本路線。好建議! –

+0

幸運的是,它支持JSONP,但使用了不同的URL。 – Ross

0

你可以寫在你的web應用一個WebMethod,做了的WebRequest從你的服務器。實質上,你用另一個函數包裝了調用,然後你可以調用你的函數,因爲它是相同的原點。

1

我最近已經實現了一個WordPress插件。

這裏是我的AJAX調用看起來像:

jQuery.ajax({ 
type : "GET", 
url : "action.php", 
data : {  
    ipinfodb_api_key : "<?php echo $ipinfodb_api_key; ?>", 
    ip : "<?php echo $_SERVER['REMOTE_ADDR']?>"}, 
     success : function(response) { 
      jQuery("#<?php echo $widgetid; ?>").html(response); 
    } 
}); 

這是我在action.php的函數,處理這些信息:

function processData($ipinfodb_api_key, $ip) { 
$longitude = null; 
$latitude = null; 
$url = 'http://api.ipinfodb.com/v2/ip_query.php?key='.$ipinfodb_api_key.'&ip='.$ip.'&timezone=false'; 
$content = @file_get_contents($url); 
if ($content != FALSE) { 
    $xml = new SimpleXmlElement($content); 
    if ($xml->Latitude) $latitude = $xml->Latitude; 
    if ($xml->Longitude) $longitude = $xml->Longitude; 
} 
    // return latitude or longitude or do further processing 
}