2010-12-17 42 views
4

我使用jQuery通过他们的IP地址获取访问者的位置。这种称为freeGeoIP的服务很棒。我需要做的只是在URL末尾加上'json'或'xml',然后添加IP地址,它会返回所需的数据。jQuery的JSON请求获得'200 OK'的答案,但没有内容

当我在浏览器中手动执行此操作时,它工作正常:我得到一个小文档以供下载。当我从浏览器执行$ .ajax或$ .getJSON请求时,它会以'200 OK'标题和下面的元数据回答。但没有实际的数据进来。发生了什么?

编辑:我添加的JavaScript/jQuery代码:

function openForm(event,ui){ 
    var _this = $(this); 
    //Get details on the user's IP 
    var myIP = $('#yourIP').attr('ip');alert(myIP); 
    var url = 'http://freegeoip.appspot.com/json/' + myIP; 
    $.ajax({ 
     url: url, 
     dataType: 'json', 
     contentType: 'text/json', 
     timeout: 10000, 
     complete: function(ip){ 
      alert('Success Ajax!'); 
      //URL returns status,ip,countrycode,countryname,regioncode,regionname,city,zipcode,latitude,longitude 
      $('#yourIP').text(ip.city + ", " + ip.countryname + " at " + ip.latitude + " latitude."); 
      $('#yourIP').attr({'city': ip.city,'country': ip.countryname}); 
     } 
    }); 

RESPONSE HEADERS 
Cache-Control no-cache 
Content-Type text/json 
Expires Fri, 01 Jan 1990 00:00:00 GMT 
Content-Encoding gzip 
Date Fri, 17 Dec 2010 15:26:48 GMT 
Server Google Frontend 
Content-Length 156 

REQUEST HEADERS 
Host freegeoip.appspot.com 
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729) 
Accept application/json, text/javascript, */*; q=0.01 
Accept-Language nl,en-us;q=0.7,en;q=0.3 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 115 
Connection keep-alive 
Content-Type text/json 
Referer http://www.freshbase.nl/permaculture/index.php 
Origin http://www.freshbase.nl 
+0

由于您可能没有正确配置您的$ .ajax()函数,因此您应该提供代码片段。 – Soviut 2010-12-17 15:38:03

+0

为什么你不能从请求头获取remote_addr?我第二个看到代码的概念。 – jMyles 2010-12-17 15:41:02

+0

当然,代码即将出现! – Wytze 2010-12-17 15:47:33

回答

10

这是因为您违反了jQuery AJAX功能中使用的XMLHttpRequest对象的跨域请求限制。有些浏览器在发生这种情况时会抛出一个空的200响应(这很令人困惑)。

您需要使用支持JSONP的服务来规避跨域问题,或者使用同一个域上的服务器端代理来充当本地中介。

+0

谢谢,您使用的术语对我来说很复杂,但我将使用JSONP作为搜索术语以了解更多信息。 – Wytze 2010-12-17 15:59:27

+0

您可以搜索的JSONP的简单示例是使用jQuery的Twitter或Flickr API。你会发现很多针对JSONP的例子。您正在使用的服务必须支持JSONP才能实现该方法。 – 2010-12-17 16:23:57

3

200只是意味着该请求没有任何错误正确返回。这是一个成功的要求。

一个成功的请求可以不返回内容,就像不返回任何记录的SQL查询一样。

+0

谢谢,我只是(只是)意识到这一点。问题是,当我从Javascript请求它的时候,我没有从URL获得任何数据,但是如果我只是在浏览器地址栏中输入URL,它确实提供了我承诺的数据。那么问题是什么? – Wytze 2010-12-17 15:40:24

+0

发布您的代码。您可能会尝试过滤某些东西等... – 2010-12-17 15:41:57

2

您正在尝试执行跨站点Ajax请求。浏览器阻止这种操作对安全是危险的。看这里如何解决你的问题: Cross-site AJAX requests

1

,所有你需要添加一个jsoncallback作为查询字符串参数

var url = 'http://freegeoip.appspot.com/json/' + myIP + "&jsoncallback=?; 

$.getJSON(url, 
     function(data){ 

     }); 
+0

嗨gov,这似乎并不奏效。这个提供者似乎没有提供JSONP格式,只有JSON。 – Wytze 2010-12-21 15:40:38

1

所以,我解决我自己的问题!感谢大家指导我走上了几条路径,这有助于我更多地了解跨站请求,JSONP等。

这真的很简单。想要获得这些数据的页面由PHP组成。在页面的相应位

$myIP = $_SERVER['REMOTE_ADDR']; 
$myGeoData = file_get_contents('http://freegeoip.appspot.com/json/' . $myIP); 

,然后附和这些变量的jQuery拿起和作用:所以我说这两条线到PHP。

因此,如果一个Web服务以文件或纯字符串的形式传递其数据,那么file_get_contents就是获取该数据并开始使用它的全部所需。

在将整个页面发送到浏览器之前,您可以在PHP中获得它,或者您可以在使用此命令的自己的服务器上为特制的PHP脚本执行Ajax请求。再次感谢人们!