2011-08-29 95 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 
}