NSURLRequest et timeout...

Bonjour,
Jusqu'à présent, j'utilisais "[font=arial,helvetica,sans-serif]NSURLRequest requestWithURL"[/font], et puis je me suis posée la question de ce qui se passait si on perd le réseau avant d'avoir obtenu le retour des données... Globablement j'ai assez peu de données à récupérer, et je considère que si ce n'est pas terminé après une dizaine de secondes, c'est qu'il y a un problème... En fouillant dans la doc, j'ai trouvé que le timeout par défaut est de 60 secondes, et qu'on peut choisir une autre valeur en utilisant "[font=arial, helvetica, sans-serif]NSURLRequest requestWithURL: cachePolicy: timeoutInterval:". Au cas où on atteint le timeout, je suppose qu'on récupère error non nil ? Si c'est le cas, comment gérez vous les erreurs ? Est-t-il préférable de préciser l'erreur qui s'est produite ? ou simplement un message "générique" du type "Erreur, problème de réseau, veuillez réessayer plus tard..."[/font]
[font=arial, helvetica, sans-serif]Merci de vos conseils...[/font]
Jusqu'à présent, j'utilisais "[font=arial,helvetica,sans-serif]NSURLRequest requestWithURL"[/font], et puis je me suis posée la question de ce qui se passait si on perd le réseau avant d'avoir obtenu le retour des données... Globablement j'ai assez peu de données à récupérer, et je considère que si ce n'est pas terminé après une dizaine de secondes, c'est qu'il y a un problème... En fouillant dans la doc, j'ai trouvé que le timeout par défaut est de 60 secondes, et qu'on peut choisir une autre valeur en utilisant "[font=arial, helvetica, sans-serif]NSURLRequest requestWithURL: cachePolicy: timeoutInterval:". Au cas où on atteint le timeout, je suppose qu'on récupère error non nil ? Si c'est le cas, comment gérez vous les erreurs ? Est-t-il préférable de préciser l'erreur qui s'est produite ? ou simplement un message "générique" du type "Erreur, problème de réseau, veuillez réessayer plus tard..."[/font]
[font=arial, helvetica, sans-serif]Merci de vos conseils...[/font]
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Généralement on a deux erreurs qu'ils faut gérer, pas de connexion internet et le cas ou y a une connexion internet et le serveur ne répond pas ( un time out), dans les deux cas un message d'erreur est obligatoire pour informer l'utilisateur.
Pour l'absence de connexion réseau, je la teste avant d'envoyer ma requête, et en cas de non disponibilité, je fais un message, mais, tu veux dire que c'est une obligation (imposée par Apple) de signaler à l'utilisateur que l'on a obtenu un timeout ? ou on peut dire qu'il y a eu un problème de connexion tout simplement, sans détailler le type de problème. Un truc du genre "problème de réseau, pas de données importées" ?
- erreur réseau : pas de réseau, timeout...
- erreur serveur : erreur 404, 500...
- erreur applicative : le serveur retourne une réponse (genee JSON) te disant qu'il y a un problème (par exemple tu demandés à ton WebService de stocker un objet mais l'objet envoyé n'est pas complet, il te retourne donc un JSON décrivant l'erreur, etc)
Chaque type d'erreur est à traiter différemment selon les cas et la situation, c'est à toi d'adapter...
Erreur serveur 404 ou 500, c'est dans le cas où le serveur est actif.
Et si le serveur est éteint ou en redémarrage (hard) ? On est dans une erreur réseau ou serveur ? On doit avoir un timeout non ?
Merci bien, je vais me mettre de ce pas à la gestion d'erreurs...
Erreur serveur pour moi c'est que le serveur est accessible, mais te répond une erreur HTTP (donc code de retour autre que 2xx). Les plus courants étant 404 ou 500, mais tous les 4xx ou 5xx y passent en fait. Dans ce cas tu n'as que les infos du header HTTP pour savoir le type d'erreur et ce qui s'est passé (400 Bad Request, 404 Not Found, ...?)
Erreur applicative c'est que le serveur est accessible, et te répond correctement, mais c'est juste que ce qu'il se trouve te répondre, c'est un JSON indiquant une erreur parce que tu l'as prévu comme ça côté applicatif (par exemple si tu demandes à ton WebService d'ajouter dans ta base un vin de 2030 alors que l'année n'existe pas encore). On appelle parfois cela une "erreur logique" dans le sens où c'est la validation côté applicatif qui détermine que la demande faite par le WebService n'est pas "logique", ne respecte pas les critères, etc.
Après tout dépend comment tu as configuré ton serveur Web. Si quand tu demandes à ton WebService l'objet d'id 7 mais que cet objet n'existe pas, tu peux décider côté WebService de retourner une erreur 404 (puisque la ressource demandé, à savoir l'objet d'id 7, n'est pas trouvé). Ou choisir que ton WebService retourne un 200 OK, mais avec un JSON de type { errorCode: 7, message:"ID not found" } si tu veux que ton WebService ait des codes d'erreur dédiés à ce genre de trucs. Selon le cas cela ne tombera alors pas dans la même catégorie d'erreur, puisque dans un cas ton code va devoir regarder le statusCode de ta réponse HTTP, dans l'autre cas il va devoir regarder le body de la requête, l'interpréter comme du JSON, traiter le cas où le JSON est invalide et ne peut être décodé, et remonter la valeur de la clé "errorCode" de ce JSON...
De même si tu oublies un paramètre dans l'appel d'une méthode tu peux décider que ton serveur retourne une erreur "400 Bad Request" et traiter cela alors côté client comme une erreur serveur (cela a tout à fait son sens en fait), ou décider que ton serveur retourne un "200 OK" avec un JSON d'erreur dans son body, qu'il te faudra décoder pour extraire l'erreur, comme toute erreur que j'appelle applicative.
Faudra que je vérifie comment je gère celle-ci.
Maintenant, l'utilisateur lambda n'a pas forcément les connaissances nécessaires pour comprendre les messages d'erreurs...
Du coup, je pense qu'il faut diviser les erreurs ainsi :
- Pas de connexion web
- Serveur inaccessible
- Erreur lors du chargement de la page/information/dialogue avec le serveur dont le message est erroné...
Donc ça c'est pour la partie code, la partie "à quel endroit doit-je mettre du code pour traiter les différents cas d'erreur"
Mais il y a aussi un découpage différent au niveau fonctionnel, pour savoir quand je remonte une alerte à l'utilisateur ou pas, et si oui quel genre de message je mets dedans.
Et du coup, par rapport à mon message initial je rajouterais (le terme message, car je parlais plus du message qui sera envoyé à l'utilisateur), pour être plus précis avec ce point de vue :