Запит Ajax повертає 200 ОК, але подія помилки запускається замість успіху


805

Я реалізував запит Ajax на своєму веб-сайті, і я дзвоню кінцеву точку з веб-сторінки. Він завжди повертає 200 ОК , але 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
ймовірно, ваш сторонній код кидає виняток.
Рагхав

3
@Raghav, якби сервер кинув виняток, обробляючи запит, тоді код повернення HTTP був би 500.
StuperUser

Відповіді:


1118

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"}

1
Дякуємо за вашу відповідь. Скажіть, будь ласка, одне, як я можу повернути значення json з коду позаду. Я використовую Asp.net з C #. Це вирішило мою проблему, але, будь ласка, також можу повідомити мені про це.
Панкай Мішра

1
@Pankaj: краще, якщо ви опублікуєте це як інше питання. Але коротка відповідь: два способи зробити це (i) замість $.ajaxвас можна спробувати $.getScript. Всередині сервера C # скрипт просто помістіть alert('Record Deleted');(без <script>тегу) і встановіть ContentType вашого C # скрипту на text/javascript. $.ajaxможе також працювати, але я не можу пригадати, як, можливо, вам просто потрібно змінити dataType: 'script',. Можливо, вам більше не потрібен обробник успіху.
Салман

3
Ця відповідь може бути не повною. Щойно я перевірив свій JSON на jsonlint.com, він прямо говорить, що це Vaild json, але все-таки подія "помилки" запускається з xhr.status 200. Які ще причини можуть бути? - Рамеш Парік щойно редагуй
Рамеш Парік

2
Або ви можете просто видалити параметр "dataType: json"
П'єро Альберто

1
Я зіткнувся з цією ж проблемою, не вказуючи тип даних при використанні $.post. У цьому випадку jquery вгадує тип даних, а потім помилки, коли він не в змозі проаналізувати . Це справді неприємна, важко знайдена гатча. Я виправив це, встановивши тип даних на "text".
Машмагар

31

Мені пощастило використовувати кілька dataTypes, розділених простором s ( 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
});

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"
        });

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


1
Дякую, Пітер, у мене була та сама проблема, і попереджувальне повідомлення на консолі браузера для мене плутає. Наскільки я знаю, CORS блокує запит на надсилання (використовуючи метод узгодження методу опцій), немає сенсу цей блок після операції після того, як завершено. Можливо, це власна поведінка браузера. Я перевірив Firefox. Дякую, ваше рішення вирішило мою проблему.
danipenaperez

15

Я вважаю, що ваша сторінка aspx не повертає об'єкт JSON. Ваша сторінка повинна робити щось подібне (page_load)

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

Response.Write(OutPut);

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

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus повинен дати вам тип помилки, яку ви отримуєте.


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',

Примітка: відлуння лише JSON Formate у PHP-файлі, якщо ви використовуєте лише php echo, повертайте код ajax 200


1

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


1

Якщо ви завжди повертаєте JSON з сервера (немає порожніх відповідей), він dataType: 'json'повинен працювати і contentTypeне потрібен. Однак переконайтеся, що вихід JSON ...

jQuery AJAX викине "аналізатор" на дійсний, але несеріалізований 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. Я думаю, що це вирішить питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.