Почему вызов $ .ajax для данных json вызывает обратный вызов ошибки, когда код состояния http «200 OK»? - PullRequest
7 голосов
/ 04 декабря 2009

У меня есть следующий запрос ajax:

        jQuery.ajax({
            async: true,
            type: "GET",
            url: url,
            data: data,
            dataType: "json",
            success: function(results){
                currentData = results;
            },
            error: function(xhr, ajaxOptions, thrownError){
                if (xhr.status == 200) {
                    console.debug("Error code 200");
                }
                else {
                    currentData = {};
                    displayAjaxError(xhr.status);
                }
            }
        });

По какой-то причине обратный вызов ошибки называется событием, хотя код состояния http равен 200, т.е. запрос в порядке. Почему это?

Ответы [ 3 ]

10 голосов
/ 04 декабря 2009

Возможно, проблема в том, что данные json, возвращаемые из URL, искажены. Когда сервер на самом деле что-то возвращает, код состояния http равен 200. Но это не значит, что данные соответствуют JSON. Убедитесь, что возвращенные строковые данные json сформированы правильно.

Я отвечаю на свой вопрос, потому что я усвоил это нелегко. Я не избежал символа "-т кавычки" в моих данных json. Это привело к очень странному поведению. К счастью, символ двойной кавычки является практически единственным символом, который необходимо экранировать из данных, доставляемых через JSON. (Подробнее об этой проблеме: Где я могу найти список escape-символов, необходимых для моего возвращаемого типа JSON ajax? )

1 голос
/ 04 декабря 2009

Ваш обратный вызов возвращает страницу с Content-type: application/json? Если нет, то это вполне может быть причиной.

0 голосов
/ 10 декабря 2009

Я часто тестирую файл: URL вместо использования веб-сервера. Мой код JSON всегда будет иметь неправильный тип MIME. Чтобы позаботиться об этом, я использую следующий код:

$(document).ready(
    function (){

        myData = {};
        $.ajax({
            type: "GET",
            // url: "json.php?fn=jsonData.json",        // with Apache
            url: "jsonData.json",                       // As a file:/// URL
            contentType: "application/json; charset=utf-8",
            data: myData,
            beforeSend: function(x) {
                if(x && x.overrideMimeType) {
                    x.overrideMimeType("application/json; charset=UTF-8");
                }
            },
            dataType: "json",

            success: function(returnData){
                 $("#jsonData").html("Success:"+returnData.tag);
            },
            error: function(returnData) {
                 $("#jsonData").html("Error:"+returnData.tag);
            }
        });
    }
);

Это заставит тип MIME быть правильным для данных JSON.

...