2010-03-07 9 views
3

J'ai une demande jQuery JSON, qui charge certains JSON d'un autre serveur (ex foo.com.):jQuery, JSON et problème Apache

$.getJSON("http://foo.com/json.php",function(data) { alert(data); }); 

Mais je reçois des données nulles. Ce problème n'est pas inter-domaine, j'ai essayé:

$.getJSON("http://twitter.com/users/usejquery.json?callback=?", 
    function(data) { alert(data); }); 

et a reçu un objet JSON agréable. Donc, je pense qu'il y a un problème avec backend, Apache 2.2.14. Voici les en-têtes HTTP, envoyés depuis le serveur:

Date: Sun, 07 Mar 2010 16:08:38 GMT 
Server: Apache/2.2.14 (CentOS) 
X-Powered-By: PHP/5.3.1 
Content-Length: 2 
Keep-Alive: timeout=15, max=99 
Connection: Keep-Alive 
Content-Type: application/json; charset=UTF-8 

Les en-têtes sont les mêmes dans chaque cas: régulier HTTP demande ou AJAX. Mais je reçois du contenu vide avec AJAX, et du JSON normal avec la demande du navigateur. J'utilise Firebug pour les tests, PHP5 pour former JSON.

Quelqu'un a des idées? Merci!

+0

Lorsque vous dites que les données sont nulles: avez-vous vérifié ce que la requête HTTP renvoie en utilisant la console Firebug? – Pointy

+0

La longueur des données renvoyées est seulement de 2 octets. Donc je suppose quelque chose comme {} ou [], qui pourrait être faux. Etes-vous sûr que votre script renvoie les données correctes? –

+0

Ce n'est pas important: 2 octets ou plus. Vous avez raison, c'est [] caractères. Ce n'est pas important. Quand j'ai dit "null" je veux dire l'affichage d'alerte "null" et la chaîne vide retournée par la console Firebug. –

Répondre

4

Je suis assez sûr que pour faire des appels inter-domaines comme celui-ci, vous devez avoir un rappel, c'est ce qui est nécessaire pour faire JSONP.

est un peu plus d'informations ici sur jsonp http://www.insideria.com/2009/03/what-in-the-heck-is-jsonp-and.html

Pour jsonp vous travailler devez avoir un rappel pour le serveur pour envelopper la chaîne JSON par exemple dans:.

$.getJSON("http://foo.com/json.php?callback=?", function(data){}); 

ici une fonction de rappel est généré par jquery et est passé dans la demande, il serait quelque chose comme:

http://foo.com/json.php?callback=generatedFunction 

alors ce qui est renvoyé par le serveur devrait être: 01 Où le paramètre de cette fonction est la chaîne json réelle.

dans le php pour revenir ce que ce serait quelque chose comme:

$callback = $_GET['callback']; 
print($callback."(".json_encode($theobject).");"); 
+1

Si vous ne fournissez pas de fonction de rappel, jQuery en crée une pour vous et appelle le rappel fourni dans l'appel "getJSON". C'est un peu le point de l'API "getJSON" :-) – Pointy

+0

vous n'avez pas encore besoin d'avoir le callback =? dans l'url? Sinon, comment le serveur sait-il comment envelopper l'objet json? –

+0

jQuery règle automatiquement tout cela pour vous. Il fait une petite fonction avec un nom unique (en utilisant un compteur interne), et l'utilise dans l'URL. Cette fonction appelle le rappel fourni à "getJSON". (Je dois vérifier à nouveau la source pour m'assurer que je ne me mets pas dans l'erreur ici, mais je lisais le code il y a quelques jours. – Pointy