it-swarm.com.de

Ajax-Anfrage gibt 200 OK zurück, aber ein Fehlerereignis wird anstelle von Erfolg ausgelöst

Ich habe eine Ajax-Anfrage auf meiner Website implementiert und rufe den Endpunkt von einer Website aus an. Es gibt immer 200 OK zurück, aber jQuery führt das Fehlerereignis aus. Ich habe viele Dinge ausprobiert, aber ich konnte das Problem nicht herausfinden. Ich füge meinen Code unten hinzu:

jQuery-Code

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 # -Code für JqueryOpeartion.aspx

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

Ich benötige den ("Record deleted")-String nach dem erfolgreichen Löschen. Ich kann den Inhalt löschen, erhalte diese Nachricht jedoch nicht. Ist das richtig oder mache ich etwas falsch? Was ist der richtige Weg, um dieses Problem zu lösen?

689
Pankaj Mishra

jQuery.ajax versucht, den Antworttext in Abhängigkeit von dem angegebenen dataType-Parameter oder dem vom Server gesendeten Content-Type-Header zu konvertieren. Wenn die Konvertierung fehlschlägt (z. B. wenn JSON/XML ungültig ist), wird der Fehlerrückruf ausgelöst.


Ihr AJAX Code enthält:

dataType: "json"

In diesem Fall jQuery:

Wertet die Antwort als JSON aus und gibt ein JavaScript-Objekt zurück. […] Die JSON-Daten werden streng analysiert. Jede fehlerhafte JSON ist abgelehnt und ein Parser-Fehler wird ausgegeben. […] Eine leere Antwort ist auch abgelehnt; Der Server sollte stattdessen eine Antwort von null oder {} zurückgeben.

Ihr serverseitiger Code gibt ein HTML-Snippet mit dem Status 200 OK zurück. jQuery erwartete gültige JSON und löst daher den Fehler-Callback aus, der sich über parseerror beschwert.

Die Lösung besteht darin, den Parameter dataType aus Ihrem jQuery-Code zu entfernen und den serverseitigen Code zurückzugeben:

Content-Type: application/javascript

alert("Record Deleted");

Ich würde jedoch eher vorschlagen, eine JSON-Antwort zurückzugeben und die Nachricht im Erfolgs-Callback anzuzeigen:

Content-Type: application/json

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

Ich hatte viel Glück mit mehreren, durch Leerzeichen getrennten dataTypes ( jQuery 1.5+ ). Wie in:

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

Sie müssen lediglich den dataType: "json" in Ihrem AJAX - Aufruf entfernen

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

Dies ist nur für die Aufzeichnung, da ich auf diesen Beitrag gestoßen bin, als ich nach einer Lösung für mein Problem suchte, die den OPs ähnlich war.

In meinem Fall wurde meine jQuery-Ajax-Anfrage aufgrund der - Same-Origin-Richtlinie in Chrome nicht erfolgreich ausgeführt. Alles wurde behoben, als ich meinen Server (Node.js) für folgende Zwecke modifizierte:

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

Es hat mich buchstäblich eine Stunde gekostet, meinen Kopf gegen die Wand zu schlagen. Ich fühle mich dumm ...

15
Corvin

Ich glaube, Ihre Aspx-Seite gibt kein JSON-Objekt zurück.

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

Response.Write(OutPut);

Versuchen Sie auch, Ihr AjaxFailed zu ändern:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus sollte Ihnen die Art des Fehlers anzeigen, den Sie erhalten.

12
LeftyX

Ich habe dieses Problem mit einer aktualisierten jQuery-Bibliothek konfrontiert. Wenn die Servicemethode nichts zurückgibt, bedeutet dies, dass der Rückgabetyp void ist.

Dann erwähnen Sie bitte in Ihrem Ajax-Anruf dataType='text'.

Es wird das Problem lösen.

11

Sie müssen nur dataType: 'json' aus Ihrem Header entfernen, wenn Ihre implementierte Webdienstmethode ungültig ist.

In diesem Fall erwartet der Ajax-Aufruf keinen JSON-Rückgabedatentyp.

6
Bilel omrani

Ich hatte das gleiche Problem. Mein Problem war, dass mein Controller einen Statuscode anstelle von JSON zurückgegeben hat. Stellen Sie sicher, dass Ihr Controller Folgendes zurückgibt:

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

Verwenden Sie den folgenden Code, um sicherzustellen, dass die Antwort im JSON-Format (PHP-Version) vorliegt ... 

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

Sieh dir das an . Es ist auch ein ähnliches Problem. Ich habe versucht zu arbeiten. 

dataType: 'JSON', nicht entfernen

Hinweis: Nur Echo-JSON-Formate in der Datei PHP), wenn Sie nur PHP-Echo für Ihren Ajax-Code verwenden. 200

1
Inderjeet

Eine andere Sache, die Dinge durcheinander brachte, war localhost anstelle von 127.0.0.1 oder umgekehrt. Anscheinend kann JavaScript keine Anfragen von einem zum anderen verarbeiten.

1
Paul

Ich habe ein ähnliches Problem, aber als ich versuchte, den Datentyp zu entfernen: 'json' Ich habe immer noch das Problem. Mein Fehler wird anstelle des Erfolgs ausgeführt

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

Ich hatte das gleiche Problem. Dies liegt daran, dass meine JSON-Antwort einige Sonderzeichen enthält und die Server-Datei nicht mit UTF-8 codiert wurde. Daher war der Ajax-Aufruf der Ansicht, dass dies keine gültige JSON-Antwort war.

0
Mehdi Izcool

Wenn Sie JSON immer vom Server zurückgeben (keine leeren Antworten), sollte dataType: 'json' funktionieren und contentType ist nicht erforderlich. Stellen Sie jedoch sicher, dass die JSON-Ausgabe ...

jQuery AJAX wirft einen 'parseerror' auf gültige, aber unserialisierte JSON!

0