Ajax-запрос возвращает 200 OK, но вместо успеха генерируется событие ошибки

806

Я реализовал запрос Ajax на своем веб-сайте и вызываю конечную точку с веб-страницы. Он всегда возвращает 200 OK , но jQuery выполняет событие ошибки.
Я много чего перепробовал, но не смог разобраться в проблеме. Я добавляю свой код ниже:

Код JQuery

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

Код C # для JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

Мне нужна ("Record deleted")строка после успешного удаления. Я могу удалить контент, но не получаю это сообщение. Это правильно или я делаю что-то не так? Как правильно решить эту проблему?

Панкадж Мишра
источник
2
Можете ли вы запустить вывод JqueryOperation.aspx через валидатор JSON и посмотреть, является ли он действительным JSON
parapura rajkumar
1
Как jsonlint.com . Вы также должны проверить параметры, которые вы отправляете. В настоящее время вы не установили имя параметра. Если параметр TwitterId, то вы должны передать объект data, а не строку: data: {TwitterId: row}.
Феликс Клинг
6
Возвращает ли страница Jqueryoperation.aspx (допустимый) JSON?
Салман А
1
вероятно, ваш код на стороне сервера выдает исключение .. что ru возвращает в вашем блоке catch в качестве ответа?
Рагхав
3
@Raghav, если сервер сгенерировал исключение при обработке запроса, то HTTP-код возврата был бы 500.
StuperUser

Ответы:

1119

jQuery.ajaxпытается преобразовать тело ответа в зависимости от указанного dataTypeпараметра или Content-Typeзаголовка, отправленного сервером. Если преобразование не удается (например, если JSON / XML является недействительным), вызывается обратный вызов ошибки.


Ваш код AJAX содержит:

dataType: "json"

В этом случае jQuery:

Оценивает ответ как JSON и возвращает объект JavaScript. […] Данные JSON анализируются строго; любой искаженный JSON отклоняется и выдается ошибка разбора. […] Пустой ответ также отклоняется; сервер должен вернуть ответ null или {}.

Ваш серверный код возвращает HTML-фрагмент со 200 OKстатусом. jQuery ожидал допустимый JSON и, следовательно, запускает функцию обратного вызова с ошибкой parseerror.

Решение состоит в том, чтобы удалить dataTypeпараметр из вашего кода jQuery и вернуть код на стороне сервера:

Content-Type: application/javascript

alert("Record Deleted");

Но я бы предпочел возвратить ответ JSON и отобразить сообщение внутри обратного вызова success:

Content-Type: application/json

{"message": "Record deleted"}
Салман А
источник
1
Спасибо за ваш ответ, вы можете сказать мне одну вещь, как я могу вернуть значение JSON из кода позади. Я использую Asp.net с C #. Это решило мою проблему, но, пожалуйста, дайте мне знать об этом тоже.
Панкадж Мишра
1
@Pankaj: лучше, если вы разместите это как другой вопрос. Но короткий ответ: два способа сделать это (я) вместо $.ajaxвас могут попробовать $.getScript. Внутри серверного сценария C # просто поместите alert('Record Deleted');(без <script>тега) и установите ContentType вашего C # сценария на text/javascript. $.ajaxможет также сработать, но я не могу вспомнить, как, может быть, вам просто нужно изменить dataType: 'script',. Возможно, вам больше не нужен обработчик успеха.
Салман
3
Этот ответ может быть неполным. Только что я проверил свой JSON на jsonlint.com, он явно говорит, что это vaild json, но все равно происходит событие «error» с xhr.status 200. Какие еще причины могут быть? - Рамеш Парик только что отредактировал
Рамеш Парик
2
Или вы можете просто удалить параметр «dataType: json»
Пьеро Альберто
1
Я столкнулся с этой же проблемой, не указав тип данных при использовании $.post. В этом случае JQuery угадывает тип данных, а затем ошибки, когда он не может проанализировать . Это действительно неприятный, труднодоступный гоча. Я исправил это, установив тип данных в "text".
Машмагар
31

Мне повезло с использованием нескольких разделенных пробелами dataTypes ( jQuery 1.5+ ). Как в:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
jaketrent
источник
1
Основываясь на документации JQuery, аналогично, сокращенная строка, такая как «jsonp xml», сначала попытается преобразовать из jsonp в xml, а в случае неудачи - из jsonp в текст, а затем из текста в xml. Так что сначала он попытается преобразовать текст в json, а если не получится, то будет рассматриваться как текст?
anIBMer
29

Вам просто нужно удалить dataType: "json" в вашем вызове AJAX

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
Филипп Дженуа
источник
22

Это только для записи, так как я наткнулся на этот пост, когда искал решение моей проблемы, которое было похоже на ОП.

В моем случае мой запрос jQuery Ajax был заблокирован из-за политики того же источника в Chrome. Все было решено, когда я изменил свой сервер (Node.js), чтобы сделать:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

Это буквально стоило мне часа удара головой о стену. Я чувствую себя глупо ...

Corvin
источник
1
Спасибо, Питер, у меня возникла та же проблема, и предупреждающее сообщение на консоли браузера меня смутило. Насколько я знаю, CORS блокирует запрос на отправку (используя согласование метода параметров), нет смысла блокировать этот запрос после завершения операции после ее завершения. Возможно, это пользовательское поведение браузера. Я тестировал с Firefox. Спасибо, ваше решение решило мою проблему.
Данипенаперез
15

Я считаю, что ваша страница aspx не возвращает объект JSON. Ваша страница должна сделать что-то вроде этого (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

Также попробуйте изменить свой AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus должен дать вам тип ошибки, которую вы получаете.

LeftyX
источник
12

Я столкнулся с этой проблемой в обновленной библиотеке jQuery. Если метод службы ничего не возвращает, это означает, что тип возвращаемого значения void.

Тогда в вашем вызове Ajax, пожалуйста, укажите dataType='text'.

Это решит проблему.

Суреш Вадлаконда
источник
8

Вам просто нужно удалить dataType: 'json'из заголовка, если ваш реализованный метод веб-службы недействителен.

В этом случае при вызове Ajax не ожидается тип возвращаемого JSON-типа.

Билель омрани
источник
4

Используйте следующий код, чтобы убедиться, что ответ в формате JSON (версия PHP) ...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
Терри Лин
источник
4

Я была такая же проблема. Моя проблема была в том, что мой контроллер возвращал код состояния вместо JSON. Убедитесь, что ваш контроллер возвращает что-то вроде:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
Александр Сулейманов
источник
3

У меня похожая проблема, но когда я попытался удалить тип данных: 'json', у меня все еще есть проблема. Моя ошибка выполняется вместо успеха

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}
Ракеш Кумар
источник
Я вижу то же самое. Пустой ответ с кодом 200 все еще вызывает обработчик ошибок.
DoubleJosh
2

Еще одна вещь, которая запутала меня, - это использование localhostвместо 127.0.0.1 или наоборот. Очевидно, JavaScript не может обрабатывать запросы от одного к другому.

Павел
источник
2

Посмотри это . Это также похожая проблема. Работая я попробовал.

Не удаляйте dataType: 'JSON',

Примечание: echo only JSON Formate в PHP-файле, если вы используете только php echo, ваш ajax код возвращает 200

Inderjeet
источник
1

У меня такая же проблема. Это произошло потому, что мой ответ JSON содержит некоторые специальные символы, а файл сервера не был закодирован с помощью UTF-8, поэтому при вызове Ajax это не был действительный ответ JSON.

Мехди Изкул
источник
1

Если вы всегда возвращаете JSON с сервера (без пустых ответов), dataType: 'json'должно работать и contentTypeне нужно. Однако убедитесь, что вывод JSON ...

JQuery AJAX сгенерирует 'parseerror' для действительного, но не сериализованного JSON!

Фабиан фон Эллертс
источник
-1

Ваш скрипт требует возврата в тип данных JSON.

Попробуй это:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
Кашиф Фараз
источник
-9

Попробуйте следовать

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

ИЛИ

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

Используйте двойные кавычки вместо одинарных кавычек в объекте JSON. Я думаю, что это решит проблему.

Салман Риаз
источник