[Résolu] AFNetworking parsing

MarcoDahMarcoDah Membre
octobre 2014 modifié dans API UIKit #1

Bonjour à  tous,


 


Bon je dois surement être hyper nul mais j'ai un soucis avec AFNetworking et j'ai besoin d'un petit coup de pouce pour me remettre dans le droit chemin.


 


Alors en gros j'essaye de faire comme ce que RESTKit ( c'est à  dire la récupération sous forme d'objet préalablement référencé dans le code) propose mais avec AFNetworking.


 


Donc, j'ai regardé la doc et l'objet retourné par le framework en cas de succès semble être l'élément intéressant pour moi. Sur des sites comme stack***, j'ai cru comprendre que cette objet est en fait un NSDictionnary (ou une NSArray). Or je ne peux le manipuler, mon application plante à  chaque fois.


 


Comme je ne voulais pas vous embêter, j'ai tenté quelques petit truc pour voir ce qui pourrais clocher:



if ([responseObject isKindOfClass:[NSArray class]]) {
NSArray *responseArray = responseObject;
/* do something with responseArray */
NSLog(@Array);

} else if ([responseObject isKindOfClass:[NSDictionary class]]) {
NSDictionary *responseDict = responseObject;
/* do something with responseDict */
NSLog(@Dictionnary);

}
else
{
NSString *className = NSStringFromClass([responseObject class]);

NSLog(@%@", className);
}

Cela me retourne un NSInlineData. Je ne sais pas trop pourquoi je récupère un objet de ce type là .


 


Merci d'avance de vos conseils.


 


PS: J'imagine que je vais me faire taper sur les doigts par quelqu'un parce que je debug avec le NSLog mais dans ce cas là  je ne voyais pas comment faire avec le debugueur ( et puis je sais pas trop m'en servir de celui la).


Réponses

  • Deux possibilités :


    1/ tu n'utilises pas l'un des parsers de AFNetworking, et donc il est logique que tu récupères un NSData ou apparenté, car le résultat brut obtenu d'une requête


    2/ tu n'utilises pas le bon parser ou bien la réponse obtenue n'est pas reconnue par le parser


  • AliGatorAliGator Membre, Modérateur
    Si c'est le cas 1 mentionné par jpimbert (et je pense que c'est le cas), utilise un AFJSONResponseSerializer pour dire que tu veux interpréter la réponse retournée par ta requête en tant qu'une réponse JSON " pour qu'il parse ledit JSON et te le transforme en NSArray ou NSDictionary.

    Je te laisse aller lire la doc de AFNetworking (son README, sa documentation en ligne etc) qui explique comment l'utiliser.
  • MarcoDahMarcoDah Membre
    octobre 2014 modifié #4

    Bonjour,


     


    Merci pour vos réponse.


     


    J'ai donc suivi vos conseils et relu la documentation de AFNetworking ( c'est quand même franchement bien fait )


     


    J'ai donc changé le type de ResponseSerializer comme vous me l'avez suggéré ( AFJSONResponseSerializer ).


     


    J'ai rencontré une petite erreur de type :



    Request failed: unacceptable content-type: text/html"

    J'ai poursuivi mes recherches et j'ai découvert que cela sous entendait que ma requête ne supportais pas le type de retour de mon serveur. Grand bien m'en fasse, j'ai ajouter ce type de retour à  ma requête et, magie !, j'ai un NSDictionnary en retour.



    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@text/html];

    Encore merci pour votre aide, pour m'avoir remis dans le droit chemin !


     


    PS: Je peux poster le code de la requête si ça intéresse quelqu'un.


  • AliGatorAliGator Membre, Modérateur
    En même temps un serveur qui retourne du JSON mais qui déclare ça comme étant du HTML dans ses headers, c'est un serveur codé avec les pieds ;)

    Faudrait peut-être demander à  la personne en charge du serveur de mettre un header "Content-Type: application/json" quand il retourne du JSON, plutôt que de faire croire que c'est du HTML quand c'est du JSON...
  • Ben pour être tout à  fait honnête avec toi, mon directeur technique n'étant pas la depuis 2 semaines, c'est moi qui me suis occupé de cette partie serveur et effectivement j'ai pas mis de "Content-Type" ( pour tout dire j'ai même pas mis de header, j'ai mis que du php pour faire la requête ) . <_<


  • C'est bien de se dénoncer :)


  • AliGatorAliGator Membre, Modérateur
    Quel rapport entre "mettre des headers" et "mettre du PHP" ? (Ca veut rien dire "mettre du PHP dans ta requête" ^^)

    Si ton serveur est écrit en PHP, dans le code de ton fichier PHP qui est sensé te retourner le JSON, il suffit juste d'écrire
    <?php
    header("Content-Type: application/json");
    // Puis le code PHP pour générer ton JSON
    ?>
    C'est qu'une ligne à  rajouter dans ton PHP.

    Et ça permettra d'avoir un serveur qui respecte les standards et qui déclare bien le type de données correctes qu'il envoie, plutôt que de dire qu'il envoie du HTML alors que c'est du JSON.
    Et ça t'évitera de modifier ton code iPhone pour dire d'accepter du HTML juste pour que ça passe, et que le jour où ton serveur te renverra du HTML là  où tu t'attends à  du JSON, ton appli ne va pas réussir à  parser le résultat (s'attendant à  du JSON et ayant une page web à  la place) et va faire n'importe quoi.
  • Je sous entendais que à  part du php il n'y avait rien ( pas de header ou de meta )


     


    Effectivement, je pense que je devrais faire les choses un peu plus proprement. Je vais d'ailleurs le faire tout de suite.


     


    Il est sure que cela m'évitera d'arranger mon code iPhone ( et donc de perdre du temps ) pour réparer mes feignantises ( oui j'invente des mots qui ne veulent rien dire )


     


    Merci pour vos conseils encore une fois. :D


  • Pour vérifier ton webservice tu peux utiliser des outils comme CocoaRestClient par exemple.


    C'est assez bien foutu et ça va te permettre de contrôler facilement le fait que ta réponse est clean ou pas en analysant les headers par exemple...

  • Je ne connaissais pas !


     


    Merci du conseil :D


Connectez-vous ou Inscrivez-vous pour répondre.