Développement application client/serveur via une API
Bonjour à tous, je me présente Pierre Ammeloot. Je suis nouveau sur ce forum.
Je commence à développer sur iPhone depuis une petite semaine.
L'objectif est de créer une application client/serveur qui dialogue avec une API.
Cette application permettras de lister des pays, ainsi que les grandes villes de chacun des pays.
Cette API demande une authentification "Basic Access Authentication" (http://en.wikipedia.org/wiki/Basic_access_authentication).
On l'appel avec une adresse du type :
http://api.monsite.com/pays/list/xml
Qui renvoie une arborescence XMl de type :
<payss>
<pays>
<nom>France</nom>
<nb_habitants>65 m</nb_habitants>
...
</pays>
<pays>
...
</pays>
...
</payss>
J'ai commencé par regarder comment faire pour faire une requête HTTP et "parser" la réponse XML. J'ai réussi à le faire sur un fichier simple.
Par contre le code que j'ai trouvé ne gère par l'authentification.
J'ai donc regardé du côté des classes Twitter pour iPhone, j'en ai trouvé une : MGTwitterEngine que je suis en train d'essayer d'adapter à mes besoins.
Apparemment (debug avec NSLog) j'arrive à appeler le fichier XML par contre je n'arrive pas à récupérer le résultat du "parser" sous forme d'objet Objective-C.
Je ne sait pas si ce que je fait comme modification/adaptation de la classe va dans le bon sens ou si je suis en train de m'embrouiller.
Est-ce que j'ai fait le bon choix en me tournant vers MGTwitterEngine ?
Existe-il des classes plus simples d'accès (et mieux documenté que MGT) pour faire des appel clients serveurs (gérant l'authentification et SSL) ?
Aujourd'hui si j'arrive à faire un cycle complet (appel à l'API avec une adresse de mon choix, récupération du XML, "parsage" et transformation en objet Objective-C) alors je pense être capable d'adapter la procédure pour l'ensemble des appel à l'API.
Est-ce que vous pouvez m'aider ? Me conseiller ?
Je vous remercie d'avance,
Cordialement,
Pierre Ammeloot
Je commence à développer sur iPhone depuis une petite semaine.
L'objectif est de créer une application client/serveur qui dialogue avec une API.
Cette application permettras de lister des pays, ainsi que les grandes villes de chacun des pays.
Cette API demande une authentification "Basic Access Authentication" (http://en.wikipedia.org/wiki/Basic_access_authentication).
On l'appel avec une adresse du type :
http://api.monsite.com/pays/list/xml
Qui renvoie une arborescence XMl de type :
<payss>
<pays>
<nom>France</nom>
<nb_habitants>65 m</nb_habitants>
...
</pays>
<pays>
...
</pays>
...
</payss>
J'ai commencé par regarder comment faire pour faire une requête HTTP et "parser" la réponse XML. J'ai réussi à le faire sur un fichier simple.
Par contre le code que j'ai trouvé ne gère par l'authentification.
J'ai donc regardé du côté des classes Twitter pour iPhone, j'en ai trouvé une : MGTwitterEngine que je suis en train d'essayer d'adapter à mes besoins.
Apparemment (debug avec NSLog) j'arrive à appeler le fichier XML par contre je n'arrive pas à récupérer le résultat du "parser" sous forme d'objet Objective-C.
Je ne sait pas si ce que je fait comme modification/adaptation de la classe va dans le bon sens ou si je suis en train de m'embrouiller.
Est-ce que j'ai fait le bon choix en me tournant vers MGTwitterEngine ?
Existe-il des classes plus simples d'accès (et mieux documenté que MGT) pour faire des appel clients serveurs (gérant l'authentification et SSL) ?
Aujourd'hui si j'arrive à faire un cycle complet (appel à l'API avec une adresse de mon choix, récupération du XML, "parsage" et transformation en objet Objective-C) alors je pense être capable d'adapter la procédure pour l'ensemble des appel à l'API.
Est-ce que vous pouvez m'aider ? Me conseiller ?
Je vous remercie d'avance,
Cordialement,
Pierre Ammeloot
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il suffit d'implémenter les bonnes méthodes, en particulier les méthodes relatives à "Connection Authentication" dans NSURLConnection.
Tout est de toute façon expliqué en détail, comme toujours, dans les programming guides (en l'occurrence celui du URL Loading System, référencé entre autres dans la doc de NSURLConnection)
A bientôt,
Pierre
Merci AliGator pour l'accueil.
J'ai suivi ta piste mais je bloque sans trop comprendre ce qu'il se passe, dans mon fichier RootViewController.view j'ai le code suivant :
L'erreur renvoyé est :
Je n'arrive pas à l'interpréter. Comment sait-on le fichier concerné et la ligne ? Désolé mes questions doivent paraitre trivial mais je débute sous XCode.
Pourtant si je dé-commente l'URL "http://localhost:80/xml/contacts-test.xml"; le fichier de test est bien chargé et affiché par le simulateur.
Je bloque donc au niveau de l'authentification sans vraiment comprendre ce qui se passe derrière.
Si quelqu'un à une piste je suis preneur.
D'avance merci et bonne journée.
Pierre
Le warning parle de cell layout sur tableView:accessoryTypeForRowWithIndexPath; et tout : ce sont des méthodes relatives à une UITableView, pour remplir cette dernière. Le warning dit, en substance, que tu as apparemment implémenté la méthode "tableView:accessoryTypeForRowWithIndexPath:" dans ton RootViewController, alors que maintenant (depuis je ne sais pas trop quelle version du SDK), ils précaunisent plutôt d'utiliser les propriétés accessoryType et editingAccessoryType sur tes UITableViewCells.
Donc en gros rien à voir avec la problématique de credentials et d'authentication pour ta requête HTTP.
Maintenant, je ne sais pas trop si ton code pour t'authentifier sur ton serveur est bon, perso j'ai jamais fait comme ça (mais j'ai rarement eu où utiliser l'authentification en même temps...). Je pensais plutôt qu'il fallait implémenter les méthodes connection:didRequestAuthentication:blabla de NSURLConnection que je t'ai citées plus haut (qui sont appellées quand le serveur a besoin d'une authentification, et te la demande donc explicitement). Maintenant ta méthode fonctionne sans doute aussi (je sais pas je me suis pas penché dessus), et permet de forcer l'authentifaction même si le serveur ne la demande pas (par exemple s'il autorise les connections sans authentifications, et retourne alors des données "publiques", aussi bien qu'il supporte les connections avec auth, et dans ce cas retournera les données privées propres à l'utilisateur, je sais pas).
En tout cas le warning n'est à priori pas lié à ton pb.
Si je comprend bien il n'est pas possible de connaà®tre la ligne de code qui pose problème lorsque la console renvoie un erreur, c'est ça ?
Ce que je ne comprend pas c'est que cette erreur n'apparaà®t pas quand j'appelle un "bête" fichier XML qui ne demande pas à être authentifier.
Sûrement que le fait de ne pas arriver à récupérer le flux XML fait que ça plante.
J'ai été voir les liens que tu m'as fournis mais je t'avoue que je n'ai aucune idée de ce qu'il faut faire concrètement. La doc. explique plein de choses mais sans code d'exemples et je ne suis pas encore assez à l'aise avec le dév. Objective-C pour comprendre ce qu'il faut faire.
Il faut que je reprenne les fonctions :
– connection:canAuthenticateAgainstProtectionSpace: delegate method
– connection:didCancelAuthenticationChallenge: delegate method
– connection:didReceiveAuthenticationChallenge: delegate method
– connectionShouldUseCredentialStorage: delegate method
Et que je les surcharge dans mon code ?
Je suis un peu perdu... Désolé de poser ce genre de question, mais si j'ai loupé un épisode je suis preneur de tutos complémentaires pour approfondir ma connaissance de l'Objective-C qui est déroutant.
Merci encore pour ton aide,
Pierre
et
Juste après :
J'ai l'erreur suivante :
Et la fonction "connection" n'est pas reconnue par XCode.
Qu'est-ce que j'ai pas fait correctement ? Le delegate dans le .h est mal fait ? (pourtant aucune erreur dans le .h)
Merci encore pour votre aide,
Pierre
Or tu as déclaré <NSURLConnection> dans l'interface de ta classe dans ton .h, donc il cherche un protocole de ce nom... et ne le trouve pas, d'où l'erreur.
Il se trouve que, comme c'est une classe qui existe depuis longtemps (à l'époque où les @protocol n'existaient pas, en Objective-C 1.0), il n'y a pas de @protocol formel à proprement parler pour ces méthodes : c'est un protocole informel.
Cela veut dire que tu as juste à implémenter les méthodes dans ton objet qui te sert de delegate (comme tu l'as fait dans ton RootViewController, si c'est bien lui le delegate de ton objet NSURLConnection évidemment) mais tu n'as pas à déclarer que tu te conformes à un protocole particulier comme NSURLConnection (puisque ledit protocole n'existe pas -- de toute façon s'il existait il s'appellerait plutôt NSURLConnectionDelegate, mais bon)
Pour le warning : si c'est un warning que tu as à la compilation, la ligne qui pose problème te sera indiquée. Tu peux même double-cliquer sur le warning pour qu'il te mène à la ligne de code. Si c'est un warning à l'exécution, alors tu n'auras pas la ligne qui correspond, c'est une erreur de runtime qui n'est plus trop dépendante du code source. C'est rare comme type de warning (en général c'est plutôt à la compilation), mais bon t'es tombé dessus :P
Je pense savoir ce qui envoie un Warning mais aucune idée de la manière de corriger ça. J'utilise à priori une méthode "deprecated" pour donner du texte à une cellule. Le Warning n'empêche pas la bonne exécution du script, je chercherais donc comment régler le problème après.
J'essaie de faire que mon code s'authentifie auprès de l'API avec le code suivant :
J'arrive à avoir dans la console : "Ok canAuthenticateAgainstProtectionSpace" mais apparemment le flux XML n'est pas récupéré.
Comme faire pour le récupérer ?
Pierre
Pour ceux que ça intéresse voici le code pour effectuer une Basic Authentification en Objective-C pour iPhone.
J'espère que ça pourras aider d'autres personnes à ne pas rester bloquer plusieurs jours sur un problème embêtants.
Merci à AliGator et à lgriffie pour votre aide.
A bientôt,
Pierre
Et puis si jamais quelqu'un trouve une meilleure solution peut être qu'il/elle l'exposeras à son tour et nous pourrons enrichir mutuellement nos connaissances.
A bientôt,
Pierre
Bravo Pierre. Juste pour apporter une precision. une methode "deprecated" signifie qu'il n'est plus conseille de l'utiliser.
Cela peut etre pour plusieurs raisons : securite, la methode ne fonctionne pas comme prevu, pas thread-safe, anomalie ...
Donc en general la methode passe de methode utilisable a deprecated, pour que les gens qui utilisent cette methode soient notifier et aient le temps d'agir en consequence.
Il est fort probable qu'une methode deprecated soit supprimer lors d'une mise a jour de la classe.
Donc tu devrais lire la documentation sur cette methode, qui t'expliquera pourquoi elle est depreciee, et ce qu'ils preconisent d'utiliser a la place !
J'ai consulté la doc. pour voir ce qu'Apple préconise, j'ai trouvé ceci :
URL : http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/text
Très bien je suis donc aller voir la méthode "textLabel" qui dit :
URL : http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/textLabel
C'est le "readonly" qui me pose problème... donc pour le moment je n'ai pas réussi à remplacer mon code :
Par autre chose qui ne soit pas "deprecated".
Si quelqu'un sait comment faire je suis preneur.
Pierre
Comment tu a fait pour comprendre ça à partir de la doc. ? Parce que rien dans la doc. ne laisse entendre que c'est ta syntaxe qu'il faut utiliser.
En tout cas merci beaucoup, un warning de moins !! 8--)
Pierre
Et si tu regardes UILabel, tu as l'accesseur "text".
un peu de curiosité :pk as tu met le "[super viewDidLoad ]" à la fin (pk pas au début de la méthode "viewDidLoad") ?
Je ne sait pas s'il y a une convention à respecter.
Pierre
J'up ce post car j'ai besoin de m'authentifier. J'y arrive avec le post de Pierre mais je ne reçois aucune réponse. Normalement je reçois une chaine de caractere.
J'ai donc à un moment
J'implémente les méthodes protocole d'authentification puis celle qui me permettent de recevoir les données :
J'ai bien l'identification mais je n'ai pas l'affichage des données. D'ailleurs je ne passe même pas dans mes deux dernières méthodes . Je vois pas trop pourquoi ...