JQuery JSON-запрос получает ответ «200 OK», но без содержания - PullRequest
4 голосов
/ 17 декабря 2010

Я использую jQuery, чтобы узнать местоположение посетителя по его IP-адресу.Для этого есть отличный сервис, который называется freeGeoIP .Все, что мне нужно сделать, это добавить 'json' или 'xml' в конце их URL, затем добавить 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 ]

10 голосов
/ 17 декабря 2010

Это потому, что вы столкнулись с междоменным ограничением запроса объекта XMLHttpRequest, используемого в функциях AJAX jQuery.Некоторые браузеры выдают пустой ответ 200, когда это происходит (что сбивает с толку).

Вам нужно либо использовать службу, поддерживающую JSONP, чтобы обойти проблему между доменами, либо использовать прокси-сервер на сторонетот же домен, чтобы действовать в качестве местного посредника.

3 голосов
/ 17 декабря 2010

200 просто означает, что запрос возвращен правильно, без ошибок. Это был успешный запрос.

Успешный запрос не может вернуть содержимое, как и запрос SQL, не возвращающий записей.

2 голосов
/ 17 декабря 2010

Вы пытаетесь выполнить межсайтовый запрос Ajax.Браузеры блокируют такие манипуляции как опасные для безопасности.Посмотрите, как решить вашу проблему: Межсайтовые запросы AJAX

1 голос
/ 22 декабря 2010

Так что я решил свою проблему! Спасибо всем за руководство по нескольким путям, которые помогли мне понять больше о межсайтовых запросах, JSONP и т. Д.

Это действительно очень просто. Страница, которая хочет получить эти данные, состоит из PHP. Поэтому я добавил эти две строки в PHP:

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

, а затем повторил эти переменные в соответствующих битах страницы, чтобы jQuery мог их обработать.

Таким образом, если веб-служба доставляет свои данные в виде файла или простой строки, file_get_contents - это все, что вам нужно для получения этих данных и начала их использования.

Вы можете получить его в PHP либо перед отправкой всей страницы в браузер, либо выполнить Ajax-запрос к специально созданному PHP-скрипту на своем собственном сервере, который использует эту команду. Еще раз спасибо, ребята!

1 голос
/ 17 декабря 2010

, все что вам нужно, чтобы добавить jsoncallback в качестве параметра строки запроса

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

$.getJSON(url,
        function(data){

        });
...