Żą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?


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

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

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

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 ...


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.


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.


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.


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;

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

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

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.


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


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.


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!


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

-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.