Żądanie Ajax zwraca 200 OK, ale zamiast powodzenia wyzwalane jest zdarzenie błędu

805

Zaimplementowałem żądanie Ajax na mojej stronie i dzwonię do punktu końcowego ze strony internetowej. Zawsze zwraca 200 OK , ale jQuery wykonuje zdarzenie błędu.
Próbowałem wielu rzeczy, ale nie mogłem rozwiązać problemu. Dodaję mój kod poniżej:

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

Kod C # dla JqueryOpeartion.aspx

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

Potrzebuję ("Record deleted")ciągu po udanym usunięciu. Jestem w stanie usunąć treść, ale nie otrzymuję tej wiadomości. Czy to prawda, czy robię coś złego? Jaki jest właściwy sposób rozwiązania tego problemu?

Pankaj Mishra
źródło
2
Czy można uruchomić dane wyjściowe pliku JqueryOperation.aspx za pomocą walidatora JSON i sprawdzić, czy jest ono poprawne JSON
parapura rajkumar
1
Jak jsonlint.com . Musisz także sprawdzić wysyłane parametry. Obecnie nie ustawiłeś żadnej nazwy parametru. Jeżeli parametr jest TwitterId, to musisz przekazać obiekt do data, nie ciąg znaków: data: {TwitterId: row}.
Felix Kling
6
Czy strona Jqueryoperation.aspx zwraca (prawidłowy) kod JSON?
Salman A
1
prawdopodobnie kod po stronie serwera zgłasza wyjątek ... co ru wraca w twoim bloku catch jako odpowiedź?
Raghav
3
@Raghav, jeśli serwer zgłosił wyjątek przetwarzający żądanie, kod powrotu HTTP wynosiłby 500.
StuperUser

Odpowiedzi:

1118

jQuery.ajaxpróbuje przekonwertować treść odpowiedzi w zależności od określonego dataTypeparametru lub Content-Typenagłówka wysłanego przez serwer. Jeśli konwersja się nie powiedzie (np. Jeśli JSON / XML jest nieprawidłowy), wywołanie zwrotne błędu zostanie uruchomione.


Twój kod AJAX zawiera:

dataType: "json"

W tym przypadku jQuery:

Ocenia odpowiedź jako JSON i zwraca obiekt JavaScript. […] Dane JSON są analizowane w ścisły sposób; każdy zniekształcony JSON jest odrzucany i generowany jest błąd analizy. […] Pusta odpowiedź również jest odrzucana; zamiast tego serwer powinien zwrócić odpowiedź null lub {}.

Kod po stronie serwera zwraca fragment kodu HTML ze 200 OKstatusem. jQuery spodziewał się prawidłowego JSON i dlatego narzeka na wywołanie zwrotne błędu parseerror.

Rozwiązaniem jest usunięcie dataTypeparametru z kodu jQuery i zwrócenie kodu po stronie serwera:

Content-Type: application/javascript

alert("Record Deleted");

Wolałbym jednak zwrócić odpowiedź JSON i wyświetlić komunikat w wywołaniu zwrotnym sukcesu:

Content-Type: application/json

{"message": "Record deleted"}
Salman A.
źródło
1
Dzięki za odpowiedź, czy możesz mi powiedzieć jedną rzecz, w jaki sposób mogę zwrócić wartość JSON z kodu z tyłu. Używam Asp.net z C #. To rozwiązało mój problem, ale mogę również dać znać o tym.
Pankaj Mishra
1
@Pankaj: lepiej, jeśli opublikujesz to jako kolejne pytanie. Ale krótka odpowiedź: $.ajaxmożesz spróbować na dwa sposoby (i) zamiast ciebie $.getScript. Wewnątrz skryptu C # po stronie serwera wystarczy umieścić alert('Record Deleted');(bez <script>znacznika) i ustawić ContentType skryptu C # na text/javascript. $.ajaxmoże również działać, ale nie pamiętam, jak to możliwe, że po prostu musisz się zmienić dataType: 'script',. Być może nie będziesz już potrzebować modułu obsługi sukcesu.
Salman
3
Ta odpowiedź może być niepełna. Właśnie sprawdziłem JSON na stronie jsonlint.com, wyraźnie mówi, że jest to vsond json, ale nadal wywoływane jest zdarzenie „błąd” z xhr.status 200. Jakie są inne powody? - Ramesh Pareek właśnie edytuje
Ramesh Pareek
2
Możesz też po prostu usunąć parametr „dataType: json”
Piero Alberto,
1
Natknąłem się na ten sam problem bez określania typu danych podczas używania $.post. W takim przypadku jquery zgaduje typ danych, a następnie błędy, gdy nie można go przeanalizować . To naprawdę paskudna, trudna do znalezienia gotcha. Naprawiłem to, ustawiając typ danych na "text".
Mashmagar
31

Miałem trochę szczęścia w używaniu wielu rozdzielonych spacjami dataTypes ( jQuery 1.5+ ). Jak w:

$.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
źródło
1
W oparciu o dokumentację JQuery, podobnie, skrót stenograficzny, taki jak „jsonp xml”, najpierw spróbuje przekonwertować z jsonp na xml, a jeśli to nie powiedzie się, przekonwertuje z jsonp na tekst, a następnie z tekstu na xml. Więc najpierw spróbuje ukryć tekst do JSona, a jeśli się nie powiedzie, to po prostu traktować jako tekst?
anIBMer
29

Musisz po prostu usunąć dataType: „json” w wywołaniu 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
});
Philippe Genois
źródło
22

To tylko dla rekordu, ponieważ wpadłem na ten post, gdy szukałem rozwiązania mojego problemu, który byłby podobny do OP.

W moim przypadku nie udało się zrealizować mojego żądania jQuery Ajax z powodu zasad tego samego pochodzenia w Chrome. Wszystko zostało rozwiązane, gdy zmodyfikowałem mój serwer (Node.js), aby:

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

Dosłownie kosztowało mnie to godzinę uderzenia głową o ścianę. Czuję się głupio ...

Corvin
źródło
1
Dzięki Peter, miałem ten sam problem, a komunikat ostrzegawczy na konsoli przeglądarki jest dla mnie zdezorientowany. O ile wiem, CORS blokuje żądanie wysyłania (przy użyciu metody negocjacji opcji), nie ma sensu, aby blok po operacji został zakończony. Może jest to niestandardowe zachowanie przeglądarki. Testowałem z Firefoksem. Dzięki, twoje rozwiązanie rozwiązało mój problem.
danipenaperez
15

Myślę, że twoja strona aspx nie zwraca obiektu JSON. Twoja strona powinna zrobić coś takiego (page_load)

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

Response.Write(OutPut);

Spróbuj także zmienić AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus powinien dać ci rodzaj błędu, który otrzymujesz.

LeftyX
źródło
12

Napotkałem ten problem ze zaktualizowaną biblioteką jQuery. Jeśli metoda usługi nic nie zwraca, oznacza to, że typem zwrotu jest void.

Następnie w swojej rozmowie Ajax proszę wspomnieć dataType='text'.

To rozwiąże problem.

Suresh Vadlakonda
źródło
8

Musisz tylko usunąć dataType: 'json'z nagłówka, jeśli zaimplementowana metoda usługi sieci Web jest nieważna.

W takim przypadku wywołanie Ajax nie oczekuje, że będzie miał zwracany typ danych JSON.

Bilel omrani
źródło
4

Użyj następującego kodu, aby upewnić się, że odpowiedź jest w formacie JSON (wersja PHP) ...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
Terry Lin
źródło
4

Miałem ten sam problem. Mój problem polegał na tym, że mój kontroler zwracał kod stanu zamiast JSON. Upewnij się, że kontroler zwraca coś takiego:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
Alexander Suleymanov
źródło
3

Mam podobny problem, ale kiedy próbowałem usunąć typ danych: „json”, nadal mam problem. Mój błąd wykonuje się zamiast sukcesu

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); }
    });
}
Rakesh Kumar
źródło
Widzę to samo. Pusta odpowiedź z kodem 200 nadal wywołuje procedurę obsługi błędów.
doublejosh 30.04.2019
2

Inną rzeczą, która popsuła mi rzeczy, było użycie localhostzamiast 127.0.0.1 lub odwrotnie. Najwyraźniej JavaScript nie obsługuje żądań od jednego do drugiego.

Paweł
źródło
2

Zobacz . To także podobny problem. Pracowałem, próbowałem.

Nie usuwaj dataType: 'JSON',

Uwaga: echo tylko JSON Formate w pliku PHP, jeśli używasz tylko php echo, kod zwrotu ajax 200

Inderjeet
źródło
1

Miałem ten sam problem. Stało się tak, ponieważ moja odpowiedź JSON zawiera pewne znaki specjalne, a plik serwera nie został zakodowany za pomocą UTF-8, więc wywołanie Ajax uznało, że nie była to poprawna odpowiedź JSON.

Mehdi Izcool
źródło
1

Jeśli zawsze zwracasz JSON z serwera (bez pustych odpowiedzi), dataType: 'json'powinno działać i contentTypenie jest potrzebne. Upewnij się jednak, że wyjście JSON ...

jQuery AJAX rzuci „parseerror” na prawidłowy, ale nieserializowany JSON!

Fabian von Ellerts
źródło
-1

Twój skrypt wymaga zwrotu w typie danych JSON.

Spróbuj tego:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
Kashif Faraz
źródło
-9

Spróbuj śledzić

$.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
});

LUB

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

Używaj podwójnych cudzysłowów zamiast pojedynczych cudzysłowów w obiekcie JSON. Myślę, że to rozwiąże problem.

Salman Riaz
źródło