web-dev-qa-db-fra.com

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

J'ai implémenté une requête Ajax sur mon site Web et j'appelle le terminal à partir d'une page Web. Il retourne toujours 200 OK , mais jQuery exécute l'événement error. J'ai essayé beaucoup de choses, mais je ne pouvais pas 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 chaîne ("Record deleted") 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?

689
Pankaj Mishra

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


Votre code AJAX contient:

dataType: "json"

Dans ce cas, jQuery:

Evalue la réponse en tant que JSON et retourne 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 renvoyée. […] Une réponse vide est aussi rejeté; le serveur doit plutôt renvoyer une réponse nulle ou {}.

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

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

Content-Type: application/javascript

alert("Record Deleted");

Mais je suggérerais plutôt de renvoyer une réponse JSON et d'afficher le message dans le rappel de réussite:

Content-Type: application/json

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

J'ai eu de la chance avec l'utilisation de dataTypes ( jQuery 1.5+ ) séparés par des espaces. 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
});
29
jaketrent

Vous devez simplement 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
});
28
Philippe Genois

Ceci est juste pour le compte rendu puisque je suis tombé sur ce post lorsque je cherchais une solution à mon problème qui ressemblait à celle du PO.

Dans mon cas, ma requête jQuery Ajax n'a pas pu aboutir à cause de same-Origin policy in Chrome. Tout a été résolu quand 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 ...

15
Corvin

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

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

Response.Write(OutPut);

Aussi, essayez de changer votre AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

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

12
LeftyX

J'ai fait face à 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.

11

Vous devez simplement 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.

6
Bilel omrani

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

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

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;
1
Terry Lin

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

Ne pas supprimer dataType: 'JSON',

Note: echo uniquement JSON Formate dans le fichier PHP si vous utilisez uniquement php echo votre code ajax retour 200

1
Inderjeet

Une autre chose qui a tout gâché pour moi a été d'utiliser localhost au lieu de 127.0.0.1 ou inversement. Apparemment, JavaScript ne peut pas gérer les demandes de l'un à l'autre.

1
Paul

J'ai le même problème, mais quand j'ai essayé de supprimer le type de données: 'json'. Mon erreur s'exécute à la place 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); }
    });
}
0
Rakesh Kumar

J'ai eu le même problème. C'était parce que ma réponse JSON contenait des caractères spéciaux et que le fichier du serveur n'était pas codé avec UTF-8. L'appel Ajax a donc considéré qu'il ne s'agissait pas d'une réponse JSON valide.

0
Mehdi Izcool

Si vous renvoyez toujours JSON depuis le serveur (pas de réponses vides), dataType: 'json' devrait fonctionner et contentType n'est pas nécessaire. Cependant, assurez-vous que la sortie JSON ...

jQuery AJAX lancera un 'analyseur syntaxique' sur un JSON valide mais non sérialisé!

0
Fabian von Ellerts