jQuery JSON请求获得'200 OK'答案,但没有内容

时间:2010-12-17 15:36:15

标签: jquery json header request ip

我正在使用jQuery通过他们的IP地址获取访问者的位置。这个名为freeGeoIP的服务很棒。我需要做的就是在他们的URL末尾添加'json'或'xml',然后添加IP地址,它将返回所需的数据。

当我在浏览器中手动执行此操作时,它可以正常工作:我需要下载一个小文档。当我从浏览器执行$ .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

5 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:3)

200只表示请求正确返回且没有错误。这是一次成功的请求。

成功的请求不能返回任何内容,就像没有返回记录的SQL查询一样。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

$.getJSON(url,
        function(data){

        });

答案 4 :(得分:1)

所以我解决了自己的问题!感谢大家指导我进入一些帮助我了解更多关于跨站点请求的路径,JSONP等。

这真的很简单。想要拥有这些数据的页面由PHP组成。所以我将这两行添加到PHP:

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

然后在页面的相应位中回显这些变量,以便jQuery选择并采取行动。

因此,如果Web服务以文件或纯字符串的形式提供其数据,则只需获取该数据并开始使用它就可以获得file_get_contents。

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