JSON возвращает пустой ответ в FireFox & Safari (Windows Vista) - PullRequest
1 голос
/ 08 сентября 2011

решено:

Проблема заключается в безопасности Firefox 6.0.2. Я изменил свой запрос URL с: http://mysite.com/ajax/request в / ajax / запрос и его работа.

Если вам нужно использовать кросс-домены, вам нужно использовать jsonp в качестве dataType.

Большое спасибо злой смерти


Мой запрос JSON на мой сервер возвращает пустой ответ. Это происходит только в Firefox 6.0.2 и Safari на компьютере с Windows Vista.

Вывод генерируется скриптом php и имеет заголовки json / application.

Возвращает пустой ответ:

    $('#ajaxcall').click(function(){
var ts = new Date().getTime();
var urlz = $('#targeturl').val()+'/'+ts;
var dataString = $("#datazz").val();
$.ajax({  
    type: "POST", url: urlz, data: "data="+dataString, 
    success: function(data){  
        var obj = jQuery.parseJSON(data);

        for (var i = 0; i < obj.length; i++) {
            var object = obj[i];
            for (property in object) {
            var s = property + "=" + object[property] + "<br>";
                $("#console").after(s);
            }
        }
    }  
});
});

А также это:

$( "#tags" ).autocomplete({
        source: function( request, response ) {
            $.post("http://mysite.com/v2/ajax/tag_suggestion/ab", {data:request.term}, function(data){
                response($.map(data, function(item) {

                if ($('#tagsboxvals').hasClass(item.name.split(' ').join('_'))){
                return null;

                } else {
                return {
                    label: item.name,
                    value: item.name
                }
                }
                }))
            }, "json");
            },
            ....
});

Спасибо за вашу помощь

Редактировать: это то, что генерирует скрипт PHP:

$arr = array(
    array('name'=>'pizza', 'point'=>'1'),
    array('name'=>'blt', 'point'=>'1'));

    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/json');
    echo json_encode($arr);

Это правильно сформированный документ JSON.

Заголовки: Заголовки ответа Дата Ср, 07 Сен 2011 23:58:42 GMT Сервер Apache / 2.2.3 (CentOS) X-Powered-By PHP / 5.1.6 Истекает понедельник, 26 июля 1997 года 05:00:00 по Гринвичу Cache-Control без кеша, обязательна повторная проверка Прагма без кеша Контент-длина 29 Соединение закрыто Приложение Content-Type / JSON Заголовки запроса Хост mysite.com Пользовательский агент Mozilla / 5.0 (Macintosh; Intel Mac OS X 10.7; версия 6.0) Gecko / 20100101 Firefox / 6.0 Принять приложение / JSON, текст / JavaScript, / ; д = 0,01 Accept-Language en-us, en; q = 0,5 Принять кодировку gzip, deflate Accept-Charset ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Поддержание связи Приложение Content-Type / x-www-form-urlencoded; кодировка = UTF-8 X-Requested-With XMLHttpRequest Реферер http://mysite.com/v2/user/register Длина контента 8 Город печенья = Нью-Йорк; __utma = 100174657.1435105779.1308773648.1314994226.1315368765.113; __utmz = 100174657.1315368765.113.98.utmcsr = mysite.com | utmccn = (направление) | utmcmd = направление | utmcct =

Заголовки пост-ответа JSON Объект {имя = "пицца", точка = 1} [Object {name = "pizza", point = 1}]

Он отлично работает с Chrome на той же машине, но не с Firefox и Safari.

1 Ответ

2 голосов
/ 08 сентября 2011

Вы должны убедиться, что ваши возвращаемые значения "действительно" JSON. Некоторые браузеры не принимают json, что синтаксически неверно.

, поэтому убедитесь, что вы вернули что-то вроде:

{"foo": 1, "bar": "foobar"}

это правильно, JSON.

например. это не:

{'foo': 1, 'bar': "foobar"}

это тоже неправильно:

{foo: 1, bar: "foobar"}

далее несколько советов к вашему коду JavaScript:

   return {
                label: item.name,
                value: item.name
            }

это не правильно, заверните ключи в кавычки. вернуть { "label": item.name, "значение": item.name }

Как правило, я читал много раз, что вы должны выполнять ajax-вызовы, поскольку GET-запросы не POST, потому что POST создает больше накладных расходов и трафика. Но не приставай ко мне.

Далее, когда вы хотите вернуться, например, массив из php, используйте json_encode ($ var)

http://php.net/manual/de/function.json-encode.php

Для вашего конкретного случая возврата:

{"name": "pizza", "point": 1}

из вашего php-скрипта.

Попробуйте на своей странице в firebug:

var obj = jQuery.parseJSON('[{"name":"pizza","point":1}]');

    for (var i = 0; i < obj.length; i++) {
        var object = obj[i];
        for (property in object) {
        var s = property + "=" + object[property] + "<br>";
            $("#console").after(s); console.log(s)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...