La requête Ajax renvoie 200 OK, mais un événement d'erreur est déclenché au lieu de réussir

805

J'ai implémenté une demande Ajax sur mon site Web et j'appelle le point de terminaison à partir d'une page Web. Il renvoie toujours 200 OK , mais jQuery exécute l'événement d'erreur.
J'ai essayé beaucoup de choses, mais je n'ai pas pu comprendre le problème. J'ajoute mon code ci-dessous:

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

Code C # pour JqueryOpeartion.aspx

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

J'ai besoin de la ("Record deleted")chaîne après une suppression réussie. Je peux supprimer le contenu, mais je ne reçois pas ce message. Est-ce correct ou est-ce que je fais quelque chose de mal? Quelle est la bonne façon de résoudre ce problème?

Pankaj Mishra
la source
2
Pouvez-vous exécuter la sortie de JqueryOperation.aspx via un validateur JSON et voir s'il est valide JSON
parapura rajkumar
1
Comme jsonlint.com . Vous devez également vérifier les paramètres que vous envoyez. Actuellement, vous n'avez défini aucun nom de paramètre. Si le paramètre est TwitterId, alors vous devez passer un objet à data, pas une chaîne: data: {TwitterId: row}.
Felix Kling
6
La page Jqueryoperation.aspx renvoie-t-elle (valide) JSON?
Salman A
1
probablement votre code côté serveur lève une exception .. ce qui ru retourne dans votre bloc catch comme réponse?
Raghav
3
@Raghav, si le serveur a levé une exception lors du traitement de la demande, alors le code de retour HTTP serait 500.
StuperUser

Réponses:

1118

jQuery.ajaxtente de convertir le corps de la réponse en fonction du dataTypeparamètre spécifié ou de l'en- Content-Typetête envoyé par le serveur. Si la conversion échoue (par exemple si le JSON / XML n'est pas valide), le rappel d'erreur est déclenché.


Votre code AJAX contient:

dataType: "json"

Dans ce cas jQuery:

Évalue la réponse au format JSON et renvoie un objet JavaScript. […] Les données JSON sont analysées de manière stricte; tout JSON mal formé est rejeté et une erreur d'analyse est levée. […] Une réponse vide est également rejetée; le serveur doit renvoyer une réponse nulle ou {} à la place.

Votre code côté serveur renvoie un extrait HTML avec 200 OKétat. jQuery attendait un JSON valide et déclenche donc le rappel d'erreur se plaignant parseerror.

La solution consiste à supprimer le dataTypeparamètre de votre code jQuery et à renvoyer le code côté serveur:

Content-Type: application/javascript

alert("Record Deleted");

Mais je préfère suggérer de retourner une réponse JSON et d'afficher le message dans le rappel de réussite:

Content-Type: application/json

{"message": "Record deleted"}
Salman A
la source
1
Merci pour votre réponse, pouvez-vous me dire une chose comment puis-je retourner la valeur json du code derrière. J'utilise Asp.net avec C #. Cela a résolu mon problème mais peut également me le faire savoir.
Pankaj Mishra
1
@Pankaj: c'est mieux si vous le postez comme une autre question. Mais réponse courte: deux façons de faire (i) au lieu de $.ajaxvous peuvent essayer $.getScript. Dans le script C # côté serveur, mettez simplement alert('Record Deleted');(sans <script>balise) et définissez le ContentType de votre script C # sur text/javascript. $.ajaxpourrait aussi fonctionner mais je ne me souviens pas comment, peut-être vous avez juste besoin de changer dataType: 'script',. Vous n'aurez peut-être plus besoin du gestionnaire de réussite.
Salman A
3
Cette réponse n'est peut-être pas complète. Tout à l'heure, j'ai validé mon JSON sur jsonlint.com, il indique explicitement qu'il s'agit d'un vaild json, mais un événement "error" est toujours déclenché, avec xhr.status 200. quelles autres raisons peuvent être là? - Ramesh Pareek vient d'éditer
Ramesh Pareek
2
Ou vous pouvez simplement supprimer le paramètre "dataType: json"
Piero Alberto
1
J'ai rencontré ce même problème sans spécifier de type de données lors de l'utilisation $.post. Dans ce cas, jquery devine un type de données, puis des erreurs lorsqu'il ne parvient pas à analyser . C'est un piège vraiment méchant et difficile à trouver. Je l'ai corrigé en définissant le type de données sur "text".
Mashmagar
31

J'ai eu de la chance avec plusieurs dataTypes séparés par des espaces ( jQuery 1.5+ ). Un péché:

$.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
});
jaketrent
la source
1
Sur la base de la documentation JQuery, de même, une chaîne abrégée telle que "jsonp xml" tentera d'abord de convertir de jsonp en xml, et, à défaut, de convertir de jsonp en texte, puis de texte en xml. Il essaiera donc de convertir le texte en json en premier, et en cas d'échec, alors juste traité comme du texte?
anIBMer
29

Il vous suffit de supprimer le dataType: "json" dans votre appel 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
});
Philippe Genois
la source
22

C'est juste pour mémoire puisque je suis tombé sur ce post lorsque je cherchais une solution à mon problème qui était similaire aux PO.

Dans mon cas, ma demande jQuery Ajax n'a pas pu aboutir en raison de la même politique d'origine dans Chrome. Tout a été résolu lorsque j'ai modifié mon serveur (Node.js) pour faire:

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

Cela m'a littéralement coûté une heure de me cogner la tête contre le mur. Je me sens stupide ...

Corvin
la source
1
Merci Peter, j'ai eu le même problème et le message d'avertissement sur la console du navigateur est confus pour moi. Autant que je sache, le CORS bloque la demande d'envoi (en utilisant la négociation de la méthode des options), cela n'a aucun sens que le bloc après l'opération après soit terminé. Peut-être est-ce un comportement de navigateur personnalisé ... J'ai testé avec Firefox. Merci, votre solution a résolu mon problème.
danipenaperez
15

Je pense que votre page aspx ne renvoie pas d'objet JSON. Votre page devrait faire quelque chose comme ça (page_load)

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

Response.Write(OutPut);

Essayez également de modifier votre AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus devrait vous donner le type d'erreur que vous obtenez.

LeftyX
la source
12

J'ai rencontré ce problème avec une bibliothèque jQuery mise à jour. Si la méthode de service ne renvoie rien, cela signifie que le type de retour est void.

Ensuite, dans votre appel Ajax, veuillez mentionner dataType='text'.

Cela résoudra le problème.

Suresh Vadlakonda
la source
8

Il vous suffit de supprimer dataType: 'json'de votre en-tête si votre méthode de service Web implémentée est nulle.

Dans ce cas, l'appel Ajax ne s'attend pas à avoir un type de données de retour JSON.

Bilel omrani
la source
4

Utilisez le code suivant pour vous assurer que la réponse est au format JSON (version PHP) ...

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

J'ai eu le même problème. Mon problème était que mon contrôleur retournait un code d'état au lieu de JSON. Assurez-vous que votre contrôleur retourne quelque chose comme:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
Alexander Suleymanov
la source
3

J'ai le même problème mais quand j'ai essayé de supprimer le type de données: «json», j'ai toujours le problème. Mon erreur s'exécute au lieu du succès

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); }
    });
}
Rakesh Kumar
la source
Je vois la même chose. Une réponse vide avec un code 200 déclenche toujours le gestionnaire d'erreurs.
doublejosh
2

Une autre chose qui a gâché les choses pour moi était d'utiliser localhostau lieu de 127.0.0.1 ou vice versa. Apparemment, JavaScript ne peut pas gérer les demandes de l'un à l'autre.

Paul
la source
2

Regardez ça . C'est aussi un problème similaire. Travailler, j'ai essayé.

Ne supprimez pas dataType: 'JSON',

Remarque: echo uniquement JSON Formate dans un fichier PHP si vous utilisez uniquement php echo votre code ajax return 200

Inderjeet
la source
1

J'ai eu le même problème. C'est parce que ma réponse JSON contient des caractères spéciaux et que le fichier serveur n'était pas codé en UTF-8, donc l'appel Ajax a considéré que ce n'était pas une réponse JSON valide.

Mehdi Izcool
la source
1

Si vous renvoyez toujours JSON du serveur (pas de réponses vides), cela dataType: 'json'devrait fonctionner et contentTypen'est pas nécessaire. Assurez-vous cependant que la sortie JSON ...

jQuery AJAX lancera un «analyseur» sur JSON valide mais non sérialisé!

Fabian von Ellerts
la source
-1

Votre script exige un retour dans le type de données JSON.

Essaye ça:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
Kashif Faraz
la source
-9

Essayez de suivre

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

OU

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

Utilisez des guillemets doubles au lieu de guillemets simples dans l'objet JSON. Je pense que cela résoudra le problème.

Salman Riaz
la source