La richiesta Ajax restituisce 200 OK, ma viene generato un evento di errore anziché l'esito positivo


805

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 molte 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 ("Record deleted")stringa dopo la cancellazione 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?


2
Puoi eseguire l'output di JqueryOperation.aspx tramite un validatore JSON e vedere se è valido JSON
parapura rajkumar

1
Come jsonlint.com . Devi anche controllare i parametri che invii. Attualmente non hai impostato alcun nome di parametro. Se il parametro è TwitterId, allora dovete passare un oggetto a data, non una stringa: data: {TwitterId: row}.
Felix Kling,

6
La pagina Jqueryoperation.aspx restituisce (valido) JSON?
Salman A

1
probabilmente il tuo codice lato server sta generando un'eccezione .. cosa sta ritornando nel tuo blocco catch come risposta?
Raghav,

3
@Raghav, se il server ha generato un'eccezione durante l'elaborazione della richiesta, il codice di ritorno HTTP sarebbe 500.
StuperUser

Risposte:


1118

jQuery.ajaxtenta di convertire il corpo della risposta in base al dataTypeparametro specificato o all'intestazione Content-Typeinviata dal server. Se la conversione non riesce (ad es. Se JSON / XML non è valido), viene richiamato 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. […] Viene respinta anche una risposta vuota; il server dovrebbe invece restituire una risposta nulla o {}.

Il codice sul lato server restituisce lo snippet HTML con 200 OKstato. jQuery si aspettava un JSON valido e quindi genera l'errore di richiamata lamentandosi parseerror.

La soluzione è rimuovere il dataTypeparametro dal codice jQuery e restituire il codice lato server:

Content-Type: application/javascript

alert("Record Deleted");

Ma preferirei suggerire di restituire una risposta JSON e visualizzare il messaggio nel callback di successo:

Content-Type: application/json

{"message": "Record deleted"}

1
Grazie per la tua risposta, per favore, puoi dirmi una cosa come posso restituire il valore JSON dal codice dietro. Sto usando Asp.net con C #. Ciò ha risolto il mio problema, ma per favore può anche farmi sapere anche questa cosa.
Pankaj Mishra,

1
@Pankaj: è meglio se lo pubblichi come un'altra domanda. Ma una risposta breve: due modi per farlo (i) invece di $.ajaxte puoi provare $.getScript. All'interno dello script C # lato server è sufficiente inserire alert('Record Deleted');(nessun <script>tag) e impostare ContentType dello script C # su text/javascript. $.ajaxpotrebbe anche funzionare ma non ricordo come, potrebbe essere solo necessario cambiare dataType: 'script',. Potrebbe non essere più necessario il gestore del successo.
Salman,

3
Questa risposta potrebbe non essere completa. Proprio ora ho convalidato il mio JSON su jsonlint.com, dice esplicitamente che si tratta di un vaild json, ma l'evento "errore" viene comunque generato, con xhr.status 200. quali altri motivi possono esserci? - Ramesh Pareek ora modifica
Ramesh Pareek,

2
Oppure puoi semplicemente eliminare il parametro "dataType: json"
Piero Alberto,

1
Ho riscontrato questo stesso problema senza specificare un tipo di dati durante l'utilizzo $.post. In questo caso, jquery indovina un tipo di dati, quindi errori quando non riesce ad analizzare . Questo è un gotcha davvero brutto e difficile da trovare. L'ho risolto impostando il tipo di dati su "text".
Mashmagar,

31

Ho avuto un po 'di fortuna con l'uso di più dataTypes separati dallo spazio ( jQuery 1.5+ ). 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
});

1
Sulla base della documentazione di JQuery, allo stesso modo, una stringa abbreviata come "jsonp xml" tenterà prima di convertire da jsonp a xml e, in caso contrario, convertirà da jsonp a testo, quindi da testo a xml. Quindi proverà prima a convertire il testo in json e, se fallito, verrà trattato come testo?
anIBMer

29

Devi semplicemente rimuovere il tipo di dati: "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
});

22

Questo è solo per la cronaca da quando mi sono imbattuto in questo post quando cercavo una soluzione al mio problema che era simile ai PO.

Nel mio caso, la mia richiesta Ajax jQuery non ha avuto esito positivo a causa della stessa politica di origine in Chrome. Tutto è stato risolto quando ho modificato il mio server (Node.js) per fare:

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

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


1
Grazie Peter, ho avuto lo stesso problema e il messaggio di avviso sulla console del browser è confuso per me. Per quanto ne so il CORS blocca la richiesta di invio (usando la negoziazione del metodo delle opzioni), non ha senso quel blocco dopo che l'operazione è stata completata. Forse è un comportamento del browser personalizzato..ho provato con Firefox. Grazie, la tua soluzione ha risolto il mio problema.
danipenaperez,

15

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


12

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

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

Risolverà il problema.


8

Devi solo rimuovere dataType: 'json'dalla tua intestazione se il tuo metodo di servizio Web implementato è nullo.

In questo caso, la chiamata Ajax non prevede di avere un tipo di dati di ritorno JSON.


4

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

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

4

Ho avuto lo stesso problema. Il mio problema era che il mio controller stava restituendo un codice di stato anziché JSON. Assicurati che il controller restituisca qualcosa del tipo:

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

3

Ho il problema simile ma quando ho provato a rimuovere il tipo di dati: "json" ho ancora il problema. Il mio errore è in esecuzione anziché Success

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

Sto vedendo la stessa cosa. La risposta vuota con un codice 200 sta ancora attivando il gestore degli errori.
doublejosh

2

Un'altra cosa che ha incasinato le cose per me era usare localhostinvece di 127.0.0.1 o viceversa. Apparentemente, JavaScript non è in grado di gestire le richieste l'una dall'altra.


2

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

Non rimuovere dataType: 'JSON',

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


1

Ho avuto lo stesso problema. È stato perché la mia risposta JSON contiene alcuni caratteri speciali e il file del server non è stato codificato con UTF-8, quindi la chiamata Ajax ha ritenuto che questa non fosse una risposta JSON valida.


1

Se si restituisce sempre JSON dal server (senza risposte vuote), dataType: 'json'dovrebbe funzionare e contentTypenon è necessario. Tuttavia, assicurarsi che l'output JSON ...

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


-1

Lo script richiede un ritorno nel tipo di dati JSON.

Prova questo:

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

-9

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

Utilizzare virgolette doppie anziché virgolette singole nell'oggetto JSON. Penso che questo risolverà il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.