Tutoriel JSON
Pierre
Membre
Bonjour à tous, j'ai trouvé un tutoriel qui expliqué bien comment appelé une API et parser le JSON renvoyé.
Le voici :
J'espère que ça va aider ceux qui cherchent à mettre en oeuvre une application client serveur qui dialogue en JSON.
Pour infos : je suis passé d'une parser XML à cette solution. Je suis passé de plusieurs dizaine de lignes de code difficile à maintenir à un code pratiquement standard. Aujourd'hui en moins de trois minutes je suis capable d'ajouter une nouvelles vue pour lire un de mes flux d'API.
Bonne lecture,
Pierre
Le voici :
- iPhone JSON Flickr Tutorial – Part 1 http://iphonedevelopertips.com/networking/iphone-json-flickr-tutorial-part-1.html
- iPhone JSON Flickr Tutorial – Part 2 http://iphonedevelopertips.com/networking/iphone-json-flickr-tutorial-part-2.html
- iPhone JSON Flickr Tutorial – Part 3 http://iphonedevelopertips.com/networking/iphone-json-flickr-tutorial-part-3.html
J'espère que ça va aider ceux qui cherchent à mettre en oeuvre une application client serveur qui dialogue en JSON.
Pour infos : je suis passé d'une parser XML à cette solution. Je suis passé de plusieurs dizaine de lignes de code difficile à maintenir à un code pratiquement standard. Aujourd'hui en moins de trois minutes je suis capable d'ajouter une nouvelles vue pour lire un de mes flux d'API.
Bonne lecture,
Pierre
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
L'auteur suppose que la callback "didReceiveData" ne sera appelée qu'une fois et que l'objet NSData reçu contiendra l'ensemble du dictionnaire JSON, ce qui n'est pas toujours le cas.
Il est en effet possible que cette méthode soit appelée plusieurs fois, et dans ce cas il faut concaténer l'ensemble des NSData reçus. C'est dans la méthode "connectionDidFinishLoading" qu'on est certain d'avoir reçu l'ensemble des données, pas avant.
Quel est l'intérêt de ce tutoriel maintenant qu'on a le magnifique Ali's JSON-RPC Framework qui fait tout tout seul ?
[/Mode Pub]
(Bon je dis ça je sais pas si l'API Flickr est en JSON-RPC ou en JSON-REST ou même en GET pur... mais bon un coup de pub ça fait du bien ^^lol)
Du coup si c'est le cas ça veut dire que rien ne nous empêche d'utiliser mon framework pour taper dans l'API FlickR, puisque toute méthode [d'un WebService JSON-RPC implémenté selon la norme 1.1 ou supérieur] pouvant être appelée en GET peut l'être également en POST (alors que l'inverse est faux mais bon). Le tuto appelle l'API en GET, mais parce que c'est plus simple pour lui (il met l'URL en dur dans sa NSURLRequest plutôt que construire son POST body)
Bon à tester faudrait que je regarde la doc de l'API FlickR, mais bon, ça y ressemble quand même. Ou alors ils ont fait un truc ressemblant à du JSON-RPC pour tromper l'ennemi, c'est possible aussi ^^
Pour en revenir au tuto, en plus de ta remarque sur la mauvaise delegate method utilisée, je viens de voir qu'ils n'encodait même pas ses valeurs GET avec des percent escapes dans sa requête, encore un truc foireux...
@AliGator : je n'utilise pas ton framework car je suis incapable de le comprendre et de l'utiliser. Je ne sait pas par quel bout prendre le problème pour mettre en oeuvre ton framework lors d'un appel à mon API. Peut être qu'avec des exemples d'utilisation j'arriverais à mieux comprendre ce que tu a fait.
Merci pour vos retours,
Pierre
Avec tout ça et tout le temps que j'ai passé à faire la doc pour faire un truc super documenté et clair et plein d'exemples de partout, et tout, si tu reviens me dire que tu ne sais pas par quel bout prendre le problème et que tu veux encore d'autres exemples alors que j'en ai déjà un paquet de fourni dans ma doc... je sais plus quoi faire là !
Mais pour moi cela reste du chinois. Je ne dit pas que tu n'as pas fait un boulot formidable, je dit juste que pour le moment je suis incapable de le comprendre.
J'ai même été sur : http://www.raboof.com/Projects/Jayrock/Demo.ashx pour essayer de faire un rapprochement entre le code JSON produit et ce qui est affiché dans l'application de test.
Mais je n'arrive pas à générer le code JSON (je ne voit pas comment lui envoyer des paramètres, j'ai essayé : http://www.raboof.com/Projects/Jayrock/Demo.ashx?echo=test mais ça ne fonctionne pas).
Pour moi un tutos comme celui donné en début du thread est compréhensible car je peut le suivre pas à pas et décortiquer les sources du projet donné à la fin. Mais ton framework je ne suis pas sur qu'il soit accessible à un développeur débutant.
Je te donne mon point de vue, je me suis sûrement mal exprimé dans mon post précédant.
Pierre
Toute la mécanique de passage des paramètres, dans le corps POST de la requête HTTP, formatté en JSON, et tout, la partie prise de tête quoi surtout pour qui ne connait pas JSON-RPC... bah t'as pas besoin de t'en soucier.
Tu fais juste
Après bien sûr certes y'a pas besoin de connaà®tre JSON ni JSON-RPC pour utiliser mon framework justement puisqu'il cache tout ça, mais faut juste quand même savoir ce qu'est un WebService, s'assurer que le WebService que tu veux attaquer a une API "JSON-RPC" (et pas SOAP ou XML-RPC ou autre), et consulter l'API dudit WebService pour avoir la liste des méthodes qu'il propose, et les arguments que prennent chacune de ces méthodes (genre ici une méthode "echo" avec un paramètre de type "string" entre autres)
Là encore suffit de lire la doc/API du WebService, sur la page du WebService en question http://www.raboof.com/Projects/Jayrock/Demo.ashx tu as justement la description du WebService avec la liste des méthodes, leurs arguments, et ce que fait chaque méthode. Si tu attaques un autre WebService bah il suffit de lire l'API qui est fournie avec le WebService pour décrire ses méthodes, s'assurer que c'est bien un WebService JSON-RPC, mais à part ça t'as rien d'autre à connaà®tre de JSON ou RPC puisque mon framework te permet d'en faire abstraction et de t'éviter de te poser ces questions.
Alors bien sûr, pour le cas de FlickR, il semble que leur API fasse tout (XML-RPC, SOAP, ...) sauf JSON-RPC donc bien sûr ce n'est pas le bon exemple :P
J'ai donc besoin de comprendre comment le framework appelle l'API, et comment renvoyer mon JSON pour qu'il soit compris correctement.
Ensuite en quoi ton framework est "mieux" que le framework utilisé dans le tutos que j'ai mis dans le premiers post du thread ? (je n'y connais pas grand chose c'est pour ça que je demande ^^).
Merci encore pour tes explications,
Pierre
Quoique, si tu utilises des frameworks également côté serveur, tu peux aussi te passer de rentrer dans le bas niveau. Par exemple pour mon projet actuel je sais que celui qui code la partie serveur utilise le Zend Framework (PHP). Du coup il code ses classes PHP5 côté serveur, avec ses méthodes prennant ses arguments, qu'il commente comme il faut, et c'est Zend qui se charge "d'exposer" cela pour que ça soit appelable en JSON-RPC c'est à dire que tu puisses appeler tes méthodes à distance depuis l'iPhone via un appel au WebService. Et du coup s'il est bon de savoir un minimum ce qu'est JSON, bah le reste de toute la mécanique lui il s'en fiche c'est Zend qui le fait.
Après je ne sais pas ce que tu vas utiliser toi côté serveur. Si tu codes tout à la main oui tu vas devoir mettre les mains dans le cambouis (en PHP, ou en Ruby, ou en ASP.NET ou en je-sais-pas-en-quoi-tu-codes-ton-serveur). Si tu utilises des frameworks tout faits ça te facilitera la vie. Mais de ce côté là , la partie serveur c'est pas trop ma spécialité donc bon je ne saurai t'en dire plus.
Ceci dit sur le principe le JSON-RPC n'est pas compliqué : le WebService reçoit, via une requête HTTP POST classique, une chaà®ne représentant un objet JSON, qui décrit la méthode à appeler et ses paramètres. Il exécute ladite méthode, et il retourne le résultat sous forme d'un autre objet JSON. Le format des objets JSON échangés (nom des champs utilisés, etc) est décrit dans les RFC et specs de JSON-RPC (et comme la norme JSON-RPC a été pensée pour être super simple et abordable, bah la spec tient en une page ça va lol)
Voici une explication du fonctionnement de l'API :
Je ne pense pas supporter JSON-RPC. C'est pour ça que c'est sûrement plus simple pour moi d'appeler mon API directement avec une adresse et de parser le JSON qui m'est renvoyé. Tu en penses quoi ?
Pierre
Cela ressemble plutôt éventuellement à du REST (je connais pas toutes les specs par coeur du REST mais en tout cas si ça n'en n'est pas ça s'en rapproche fortement).
Le REST étant un une façon de communiquer avec un WebService au même titre que SOAP, JSON-RPC ou XML-RPC, mais chacun est différent dans son format. Donc là si tu as du REST (XML-REST ou JSON-REST puisqu'avec ton paramètre "format" tu peux choisir) le RPC n'intervient pas.
Et du coup je ne sais pas (faut chercher sur github ou autre) s'il existe des frameworks iPhone pour faire du REST, qui se chargent d'encoder les paramètres GET comme il faut avec les urlencodes, récupérer la réponse, la parser, et tout... et si c'est pas le cas il faudra refaire tout ça à la main (bon avec SBJSON pour parser le JSON mais ça c'est pas méchant, y'a juste 2 méthodes une pour transformer un NSArray ou NSDictionary en sa représentation JSON (une chaà®ne), l'autre pour faire l'inverse, chaà®ne JSON vers object Cocoa...
J'ai commencé avec un parser XML et j'avais un code lourd et non générique, avec SBJSON mon code est beaucoup plus léger et générique.
Pierre