it-swarm.com.ru

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

Я реализовал запрос 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") после успешного удаления. Я могу удалить контент, но не получаю это сообщение. Это правильно или я делаю что-то не так? Как правильно решить эту проблему?

689
Pankaj Mishra

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 и отобразить сообщение в обратном вызове успеха:

Content-Type: application/json

{"message": "Record deleted"}
1000
Salman A

Мне повезло с использованием нескольких разделенных пробелами 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
});
29
jaketrent

Вам просто нужно удалить 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
});
28
Philippe Genois

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

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

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

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

15
Corvin

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

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

Response.Write(OutPut);

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

function AjaxFailed (XMLHttpRequest, textStatus) {

}

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

12
LeftyX

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

Затем в своем вызове Ajax укажите dataType='text'.

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

11
Suresh Vadlakonda

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

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

6
Bilel omrani

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

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
3
Alexander Suleymanov

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

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
1
Terry Lin

Видеть это . Это также похожая проблема. Работая я попробовал. 

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

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

1
Inderjeet

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

1
Paul

У меня похожая проблема, но когда я попытался удалить тип данных: '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); }
    });
}
0
Rakesh Kumar

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

0
Mehdi Izcool

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

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

0
Fabian von Ellerts