2009-08-10 13 views
1

J'ai un appel getJSON qui échoue inexplicablement. L'idée est, vous cliquez pour soumettre un commentaire, une URL est frappée qui détermine si le commentaire est OK ou contient des mots coquins. La réponse est donnée sous forme JSON.Echec de getJSON, JSON valide

Voici le JS apparié qui génère l'appel. Le commentaire et l'URL sont déjà sur la page, il les saisit et frappe l'URL:

FORMULAIRE HTML:

<fieldset id="mg_comment_fieldset" class="inlineLabels"> 
<div class="ctrlHolder"> 
    <textarea id="id_comment" rows="10" cols="40" name="comment"></textarea> 
</div> 
<div class="form_block"> 
    <input type="hidden" name="next" value="" /> 
    <input id="mg_comment_url" type="hidden" name="comment_url" value="" /> 

    <input id="mg_comment_submit" type="submit" value="Remark" /> 
</div> 
</fieldset> 

SPECIFIQUE JS BLOC QUE ENVOIE/READS RÉPONSE:

$('input#mg_comment_submit').click(function(){ 
var comment = $("textarea#id_comment").val(); 
var comment_url = $('input#mg_comment_url').val(); 
$.getJSON(
    comment_url+"?callback=?&comment="+comment+"&next=", 
    function(data){ 
     console.log(data); 
     alert(data); 
    });   
}); 

Le Réponse JSON:

[{"errors": {"comment": ["Weve detected that your submission contains words which violate our Terms and Conditions. Please remove them and resubmit test"]}}] 

Il est renvoyé sous la forme d'un type d'application/json. Il valide dans JSONLint. J'ai également essayé d'ajouter quelques fonctions AJAX pour essayer d'attraper les erreurs, et ils sont tous les deux silencieux. Je peux voir la demande sortir dans Firebug, et revenir en tant que réponses de statut 200, qui valident dans JSONLint et que je peux traverser très bien dans l'onglet JSON de la réponse. Si je mets une alerte avant le getJSON, il s'exécute; c'est juste que rien à l'intérieur ne fonctionne. Je trouve également que si je change .getJSON en .get, les alertes s'exécutent, suggérant que c'est quelque chose avec le JSON. Je n'ai plus d'idées sur ce que pourrait être le problème. En utilisant Firefox 3.0.13.

+0

Veuillez conserver vos adresses URI idempotentes. Même les ajax. Cela devrait utiliser '$ .post'. Lorsque vous ne le faites pas, c'est en fait une violation de la spécification HTTP http://www.w3.org/2001/tag/doc/whenToUseGet.html#safe –

Répondre

3

Le paramètre querystring « callback=? » entre en jeu si vous utilisez cross-site scripting ou jsonp, si vous envoyez des messages le même serveur, vous n'avez pas besoin d'utiliser.

Si vous avez besoin ou souhaitez utiliser cette option, le code côté serveur doit revenir avec la fonction de rappel incluse dans la réponse json.

Exemple:

$jsonData = getDataAsJson($_GET['symbol']); 
echo $_GET['callback'] . '(' . $jsonData . ');'; 
// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"}); 

donc faire soit un changement côté serveur si nécessaire, retirez simple ou le paramètre "callback=?" de l'URL.

Voici more info on jsonp

+0

Cela aurait pu le faire ...juste fait un test rapide et a obtenu quelque chose en retour. La boutique est en train de fermer, donc je vais travailler plus sur ça demain et essayer de vérifier avant de marquer comme réponse. – KRH

+0

Oui, ça l'a fait, bien qu'il y ait d'autres appels utilisant un rappel et ne pas échouer ... je ne sais pas pourquoi celui-ci l'a fait. Django génère la réponse. De toute façon, le script ne devrait pas avoir besoin d'être crossdomain, donc je signale ceci comme réponse. Je vous remercie! – KRH

1

Pouvez-vous appeler manuellement votre service sans erreur? Avez-vous essayé d'utiliser firebug et regardé sous XBR pour voir la publication/réponse des charges utiles JSON? J'utilise normalement .NET comme mes points de terminaison, et avec .NET 3.5, j'ai besoin d'utiliser le type de contenu "application/json; charset = utf-8".

Voici un exemple d'un appel de travail JSON J'utilise dans .NET avec jQuery 1.3.2

$.ajax({ 
    type: "POST", 
    url: "WebService1.ASMX/HelloWorld", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{}", 
    success: function(res) { 
    // Do your work here. 
    // Remember, the results for a ASMX Web Service are wrapped 
    // within the object "d" by default. e.g. {"d" : "Hello World"} 
    } 
}); 
0

Avez-vous essayé avec .ajax $? Vous pouvez alors définir à la fois les rappels d'erreur et de succès et avoir une meilleure idée.

0

Pouvez-vous essayer d'ajouter une fonction ajaxError globale pour enregistrer l'erreur.

$.ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError){ 
    console.log(thrownError); 
}); 
+0

Essayé cela, aucune erreur n'a malheureusement été levée. – KRH

+0

Ces URL de domaine sont-elles? – redsquare