2009-12-04 10 views
7

J'ai la demande ajax suivante:

 jQuery.ajax({ 
      async: true, 
      type: "GET", 
      url: url, 
      data: data, 
      dataType: "json", 
      success: function(results){ 
       currentData = results; 
      }, 
      error: function(xhr, ajaxOptions, thrownError){ 
       if (xhr.status == 200) { 
        console.debug("Error code 200"); 
       } 
       else { 
        currentData = {}; 
        displayAjaxError(xhr.status); 
       } 
      } 
     }); 

Pour une raison quelconque le rappel d'erreur est appelé événement si le code d'état HTTP 200 ie. la demande est OK. Pourquoi est-ce?

Répondre

10

Le problème peut être que les données json renvoyées à partir de l'URL sont malformées. Lorsque le serveur retourne quelque chose, le code d'état http est 200. Mais cela ne signifie pas que les données sont correctes. Vérifiez que les données json stringifiées renvoyées sont correctement formées.

Je réponds à ma propre question parce que j'ai appris cela à la dure. Je n'avais pas échappé à un caractère "-quote" dans mes données json, ce qui a donné lieu à un comportement très étrange, heureusement le caractère de double guillemets est à peu près le seul caractère qui doit être échappé des données fournies via JSON. Where can I find a list of escape characters required for my JSON ajax return type?)

1

Votre rappel renvoie-t-il une page avec Content-type: application/json? Si non, cela pourrait bien être la raison.

+0

J'ai testé cela et il semble que cela n'a pas d'importance. ks) dans les deux sens avec et sans la déclaration de type de contenu. – kosoant

+0

hmmm peut-être que c'était la bibliothèque prototype pas jquery alors – Greg

0

je fais beaucoup de tests avec le fichier: urls au lieu d'utiliser un serveur Web Mon code JSON aura toujours le mauvais type MIME Pour prendre soin de ce que j'utilise le code suivant:..

$(document).ready(
    function(){ 

     myData = {}; 
     $.ajax({ 
      type: "GET", 
      // url: "json.php?fn=jsonData.json",  // with Apache 
      url: "jsonData.json",      // As a file:/// URL 
      contentType: "application/json; charset=utf-8", 
      data: myData, 
      beforeSend: function(x) { 
       if(x && x.overrideMimeType) { 
        x.overrideMimeType("application/json; charset=UTF-8"); 
       } 
      }, 
      dataType: "json", 

      success: function(returnData){ 
       $("#jsonData").html("Success:"+returnData.tag); 
      }, 
      error: function(returnData) { 
       $("#jsonData").html("Error:"+returnData.tag); 
      } 
     }); 
    } 
); 

Cela va forcer le type MIME à être correct pour les données JSON