Je travaille sur un projet iOS.
Dans cette application, je télécharge des images depuis le serveur.
Problème:
Pendant le téléchargement des images, je reçois le délai d'expiration de la demande . Selon la documentation, le code d'état HTTP du délai d'expiration de la demande est 408
.
Mais dans mon application, j'obtiens un code d'état HTTP 0
avec l'erreur suivante
Domaine d'erreur = NSURLErrorDomain Code = -1001 "La demande a expiré." UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg = La description de la requête NSLocalized ., NSUnderlyingError = 0x13846870 "La requête a expiré."}
Lors d'une recherche, sur Internet, je n'ai trouvé aucune information sur le code d'état HTTP 0.
Quelqu'un peut-il m'expliquer cela?
la source
Réponses:
Il n'y a pas de code d'état HTTP 0. Ce que vous voyez est un 0 renvoyé par l'API / la bibliothèque que vous utilisez. Vous devrez vérifier la documentation pour cela.
la source
Un code d'état de 0 dans un
NSHTTPURLResponse
objet signifie généralement qu'il n'y a pas eu de réponse et peut se produire pour diverses raisons. Le serveur ne retournera jamais un état de 0 car ce n'est pas un code d'état HTTP valide.Dans votre cas, vous semblez obtenir un code d'état de 0 car la demande expire et 0 est simplement la valeur par défaut de la propriété. Le délai lui-même peut être dû à diverses raisons, telles que le serveur ne répond tout simplement pas à temps, est bloqué par un pare-feu ou toute votre connexion réseau est interrompue. Habituellement, dans le cas de ce dernier, le téléphone est suffisamment intelligent pour savoir qu'il n'a pas de connexion réseau et qu'il échouera immédiatement. Cependant, il échouera toujours avec un code d'état apparent de 0.
Notez que dans les cas où le code d'état est 0, l'erreur réelle est capturée dans l'
NSError
objet retourné , pas dans le fichierNSHTTPURLResponse
.Le statut HTTP
408
est assez rare dans mon expérience. Je n'en ai jamais rencontré moi-même. Mais il est apparemment utilisé dans les cas où le client a besoin de maintenir une connexion de socket active au serveur, et le serveur attend que le client envoie plus de données sur le socket ouvert, mais ce n'est pas le cas dans un laps de temps donné et le serveur termine la connexion avec un408
code d'état, indiquant essentiellement au client "vous avez pris trop de temps".la source
La réponse était vide. Dans la plupart des cas, les codes seront statistiques avec 1xx, 2xx, 3xx, 4xx, 5xx.
Liste des codes d'état HTTP
la source
Dans le SDK iOS Lorsque votre appel API expire, vous obtenez le statut 0 pour cela.
la source
D'après mon expérience limitée, je dirais que les deux scénarios suivants pourraient provoquer une réponse
status code: 0
, gardez à l'esprit; leur pourrait être plus, mais je connais ces deux:le fait est,
status: 0
est légèrement générique, et il pourrait y avoir plus de cas d'utilisation qui déclenchent un corps de réponse vide.la source
Le code d'état '0' peut se produire pour trois raisons
1) Le client ne peut pas se connecter au serveur
2) Le client ne peut pas recevoir la réponse dans le délai d'expiration
3) La demande a été "arrêtée (abandonnée)" par le client.
Mais ces trois raisons ne sont pas standardisées
la source
La réponse HTTP 0 n'est pas une réponse HTTP standard. Mais cela indique que le client n'a pas pu se connecter au serveur et donc un délai d'attente s'est produit.
la source
Nous avons eu l'erreur:
AVOIR http: //localhost/pathToWebSite/somePage.aspx a généré une erreur http.status: 0
Cet appel est effectué à partir d'une tâche Windows qui appelle un fichier VBS, donc pour résoudre le problème, pointez un navigateur vers l'URL et nous obtenons une erreur de confidentialité:
En effet, nous avons une règle de réécriture d'URL IIS définie pour forcer les connexions à utiliser https. Cette règle détourne http: // localhost vers https: // localhost mais notre certificat SSL est basé sur un nom de domaine extérieur non localhost, donc l'erreur qui est signalée comme code d'état 0. Une erreur de confidentialité pourrait donc être une raison très obscure pour ce code d'état 0.
Dans notre cas, la solution était d'ajouter une exception à la règle pour localhost et d'autoriser http: //localhost/pathToWebSite/somePage.aspx à utiliser http. Obscur, oui, mais je vais rencontrer cela l'année prochaine et maintenant je trouverai ma réponse dans une recherche Google.
la source
Parfois, le navigateur répond au gestionnaire d'erreurs http avec un objet d'erreur, dont l'état est défini sur 0, même si vous pouvez voir l'état d'erreur 404, 401, 500, etc. dans le réseau.
Cela peut se produire si votre application et votre API sont sur des domaines différents - le mécanisme CORS est appliqué. Selon CORS pour chaque requête d'API, le navigateur envoie deux requêtes:
Dans l'application, nous gérons la réponse d'erreur pour la "demande réelle / d'origine", et si la "demande OPTIONS de contrôle en amont" a échoué - le navigateur ne donne pas l'objet HttpError correct pour le gestionnaire d'erreurs http. Donc, pour obtenir le statut correct de la réponse http, assurez-vous d'obtenir une réponse à la demande OPTIONS de contrôle en amont.
la source
CORS dans mon cas.
J'ai eu une telle réponse dans une application iOS une fois. La solution était le manque
Access-Control-Allow-Origin: *
dans les en-têtes.En savoir plus: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
la source
Cela peut se produire avec une réponse http 401 si vous utilisez NSURLConnection.
Voir NSURLConnection renvoyant une erreur au lieu de la réponse pour 401
la source
Lors de l'expiration du délai de passage de la porte, l'état sera nul lors de votre rappel d'erreur.
Codes d'état HTTP
la source