web-dev-qa-db-fra.com

jquery appel ajax renvoyant une erreur avec readystate 4, status 200, statustext ok

C'est vraiment ahurissant. Je reçois un callback d'erreur de la part de ajax. Mais si je prends le message res.responseText (qui revient correct, btw) à partir du message d'erreur et que je l'utilise, le résultat est correct. Juste comme si j'avais reçu un rappel de succès.

Les données sont définies comme ceci:

var dataToSend = {fieldname : textdata};

et l'appel ajax est comme ceci:

var ajaxOptions = {
    url: '/newpage',
    data: JSON.stringify(dataToSend),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    processData: false,
    type: 'POST',
    success: function(res) {
        console.log("success!");
        $('#' + divname).html(res);
    },
    error: function(res) {
        console.log("There was an error: " + JSON.stringify(res));
        $('#' + divname).html(res.responseText);
    }
};

$.ajax(ajaxOptions);

Le message d'erreur est le suivant: Une erreur s'est produite: {"readyState":4,"responseText" [this part is perfectly fine], "status":200, "statusText":"OK"}.

7
lynvie

Si votre responseText n'est pas un JSON correct, une erreur d'analyse est générée. Assurez-vous que votre réponse est un fichier JSON valide ou remove dataType: "json".

De docs jQuery :

dataType (par défaut: Intelligent Guess (xml, json, script ou html))

Type: chaîne

Le type de données que vous attendez du serveur. Si aucun est spécifié, jQuery essaiera de l'inférer en fonction du type MIME de la réponse (un type XML MIME donnera XML, dans JSON 1.4, un objet JavaScript, dans un script 1.4 exécutera le script. Les types disponibles (et Le résultat transmis comme premier argument à votre rappel de succès) sont:

...

"json": évalue la réponse en tant que JSON et renvoie un code JavaScript objet. Les demandes "json" entre domaines sont converties en "jsonp" sauf si la requête inclut jsonp: false dans ses options de requête. Le JSON les données sont analysées de manière stricte; tout JSON mal formé est rejeté et une erreur d'analyse est renvoyée. Depuis jQuery 1.9, une réponse vide est aussi rejeté; le serveur doit renvoyer une réponse null ou {} à la place de . (Consultez json.org pour plus d'informations sur le formatage JSON approprié.)

13
Diego

Cela se produit lorsque vous avez défini dataType pour obtenir la réponse, mais que la réponse n’est pas celle que vous avez définie dans le type de données. 

Donc, dans votre cas, dataType: 'json', est défini et comme vous l'avez mentionné dans la section commentaire, vous avez défini string dans le backend. Vous devez donc définir votre type de données sur text

changez votre type de données en:

dataType: 'text',
2
Jai

Un moyen de résoudre le problème côté serveur consiste à faire écho à un tableau vide, codé en json: 

echo json_encode([]);
return;

Ensuite, la fonction de réussite est déclenchée à la place de l'erreur.

Ou changez simplement scriptside dataType: 'json', en dataType: 'text', pour indiquer à jQuery de recevoir une réponse textuelle.

0
Kai Noack