javascript xhr La richiesta Ajax restituisce 200 OK, ma viene generato un evento di errore anziché il successo




xmlhttprequest parameters (13)

jQuery.ajax tenta di convertire il corpo della risposta in base al parametro dataType specificato o all'intestazione Content-Type inviata dal server. Se la conversione fallisce (ad es. Se JSON / XML non è valido), viene attivato il callback dell'errore.

Il tuo codice AJAX contiene:

dataType: "json"

In questo caso jQuery:

Valuta la risposta come JSON e restituisce un oggetto JavaScript. [...] I dati JSON vengono analizzati in modo rigoroso; qualsiasi JSON non valido viene rifiutato e viene generato un errore di analisi. [...] anche una risposta vuota viene respinta; il server dovrebbe restituire invece una risposta di null o {}.

Il tuo codice lato server restituisce snippet HTML con 200 OK stato 200 OK . jQuery si aspettava un JSON valido e quindi parseerror richiamata dell'errore lamentandosi di parseerror .

La soluzione è rimuovere il parametro dataType dal codice jQuery e rendere il codice sul lato server restituito:

Content-Type: application/javascript

alert("Record Deleted");

Ma vorrei piuttosto suggerire di restituire una risposta JSON e visualizzare il messaggio all'interno della callback di successo:

Content-Type: application/json

{"message": "Record deleted"}

Ho implementato una richiesta Ajax sul mio sito Web e sto chiamando l'endpoint da una pagina Web. Restituisce sempre 200 OK , ma jQuery esegue l'evento di errore. Ho provato un sacco di cose, ma non sono riuscito a capire il problema. Sto aggiungendo il mio codice qui sotto:

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

Codice C # per JqueryOpeartion.aspx

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

Ho bisogno della stringa ("Record deleted") dopo l'eliminazione riuscita. Sono in grado di eliminare il contenuto, ma non ricevo questo messaggio. È corretto o sto facendo qualcosa di sbagliato? Qual è il modo corretto per risolvere questo problema?


Se restituisci sempre JSON dal server (nessuna risposta vuota), dataType: 'json' dovrebbe funzionare e contentType non è necessario. Tuttavia assicurati che l'uscita JSON ...

jQuery AJAX genererà un "parseerror" su JSON valido ma non serializzato!


Vedi questo . È anche un problema simile. Lavorando ho provato

Non rimuovere dataType: 'JSON',

Nota: echo solo JSON Formate in file PHP se usi solo php echo il tuo codice ajax return 200


Lo script richiede un ritorno nel tipo di dati JSON.

Prova questo:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}

Suppongo che la tua pagina aspx non restituisca un oggetto JSON. La tua pagina dovrebbe fare qualcosa del genere (page_load)

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

Response.Write(OutPut);

Inoltre, prova a cambiare il tuo AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus dovrebbe darti il ​​tipo di errore che stai ricevendo.


Ho il problema simile ma quando ho provato a rimuovere il tipo di dati: 'json' ho ancora il problema. Il mio errore è in esecuzione al posto del successo

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

Usa il seguente codice per assicurarti che la risposta sia in formato JSON (versione PHP) ...

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

Prova a seguire

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

O

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

Usa le virgolette anziché le virgolette singole nell'oggetto JSON. Penso che questo risolva il problema.


Ho avuto un po 'di fortuna nell'usare più dataType separati da dataType ( jQuery.ajax ). Come 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
});

Devi semplicemente rimuovere il dataType: "json" nella tua chiamata 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
});

Ho avuto lo stesso problema. Il mio problema era che il mio controller stava restituendo un codice di stato invece di JSON. Assicurati che il tuo controller restituisca qualcosa come:

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

Ho affrontato questo problema con una libreria jQuery aggiornata. Se il metodo di servizio non restituisce nulla, significa che il tipo di reso è void .

Quindi nella tua chiamata Ajax per favore menziona dataType='text' .

Risolverà il problema.


Questo è solo per la cronaca da quando mi sono imbattuto in questo post quando cercavo una soluzione al mio problema che fosse simile agli OP.

Nel mio caso è stata impedita la richiesta di jQuery Ajax a causa della politica della stessa origine in Chrome. Tutto è stato risolto quando ho modificato il mio server (Node.js) per farlo:

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

Mi è costata letteralmente un'ora di sbattere la testa contro il muro. Mi sento stupido ...





json