web-dev-qa-db-fra.com

Code d'état HTTP 0 - Domaine d'erreur = NSURLErrorDomain?

Je travaille sur un projet iOS.

Dans cette application, je télécharge des images du serveur.

Problème:

Pendant le téléchargement des images, je reçois Request Timeout . Selon la documentation, le code d'état HTTP du délai d'attente de la demande est 408.

Mais dans mon application, je reçois le code de statut HTTP 0 avec l'erreur suivante

Domaine d'erreur = Code NSURLErrorDomain = -1001 "La demande a expiré." UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PGG /1383906967_5621_63.jpg , NSLocalizedDescription = La requête a expiré., NSUnderlyingError = 0x13846870 "La requête a expiré."}

Lors d’une recherche, sur Internet, je n’ai trouvé aucune information sur le code HTTP HTTP 0.

Quelqu'un peut-il m'expliquer cela?

81
Irfan DANISH

Il n'y a pas de code d'état HTTP 0. Ce que vous voyez est un 0 renvoyé par l'API/bibliothèque que vous utilisez. Vous devrez vérifier la documentation pour cela.

82
Julian Reschke

Un code d'état de 0 dans un objet NSHTTPURLResponse signifie généralement qu'il n'y a pas eu de réponse et qu'il peut se produire pour différentes raisons. Le serveur ne renverra jamais un statut égal à 0 car il ne s'agit pas d'un code d'état HTTP valide.

Dans votre cas, vous apparaissez pour obtenir un code d'état de 0 car la requête arrive à expiration et 0 n'est que la valeur par défaut de la propriété. Le délai d'attente lui-même peut être dû à diverses raisons, telles que le fait que le serveur ne répond pas à temps, qu'il est bloqué par un pare-feu ou que votre connexion réseau est complètement interrompue. Généralement, dans ce dernier cas, le téléphone est suffisamment intelligent pour savoir qu’il n’a pas de connexion réseau et é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'objet NSError renvoyé, et non dans NSHTTPURLResponse.

Le statut HTTP 408 est assez rare dans mon expérience. Je n'ai jamais rencontré un moi-même. Mais il est apparemment utilisé dans les cas où le client doit conserver une connexion de socket active au serveur et que celui-ci attend que le client envoie plus de données via le socket ouvert, mais pas dans un délai donné. le serveur met fin à la connexion avec un code de statut 408, indiquant au client "que vous avez pris trop de temps".

62
devios1

Dans le SDK iOS Lorsque le délai d’appel de votre API est expiré, vous obtenez le statut 0 pour cela.

10
Ankit Kumar Gupta

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

8
VDN

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:

  • votre connexion répond peut-être lentement.
  • ou peut-être que le serveur principal n'est pas disponible.

le problème est que status: 0 est légèrement générique et qu'il pourrait y avoir davantage de cas d'utilisation déclenchant un corps de réponse vide.

5
Simple-Solution

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 que le délai d'attente s'est écoulé.

3
shuaib ahmad

Nous avons eu l'erreur:

GET 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. Pour résoudre le problème, un navigateur a alors pointé l'URL et une erreur de confidentialité s'est produite:

Votre connexion n'est pas privée

Il est possible que les pirates tentent de voler vos informations à localhost (par exemple, mots de passe, messages ou cartes de crédit). NET :: ERR_CERT_COMMON_NAME_INVALID

Signaler automatiquement à Google les détails des éventuels incidents de sécurité. Politique de confidentialité Retour à la sécurité Ce serveur n'a pas pu prouver qu'il était localhost; son certificat de sécurité provient de * .ourdomain.com. Cela peut être dû à une mauvaise configuration ou à un attaquant qui intercepte votre connexion. Apprendre encore plus.

En effet, nous avons un jeu de règles de réécriture d'URL IIS pour forcer les connexions à utiliser https. Cette règle transfère http: // localhost vers https: // localhost mais notre certificat SSL est basé sur un nom de domaine externe qui ne fait pas face à localhost, d'où l'erreur 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 consistait à ajouter une exception à la règle pour localhost et à permettre à http: //localhost/pathToWebSite/somePage.aspx d'utiliser http. Obscure, oui, mais je vais rencontrer cela l'année prochaine et je vais maintenant trouver ma réponse dans une recherche google.

2
Jeff Mergler

Le code d'état '0' peut être dû à 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 imparti
3) La demande était "arrêtée (annulée)" par le client.

Mais ces trois raisons ne sont pas standardisées

1
Hariprasath Yadav

CORS dans mon cas.

J'ai eu une telle réponse dans une application iOS une fois. La solution était le manquant Access-Control-Allow-Origin: * dans les en-têtes.

Plus: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

1
olivier

Au bout du délai d'attente, l'état sera égal à zéro lorsque votre erreur sera rappelée.

.error( function( data,status,headers,config){
    console.log(status) 
 }

codes de statut HTTP

0
Prashobh

J'ai un Java script ajax client et un serveur d'application express de nodejs

Le code client ressemble à:

...
var status1 = xmlHttpRequest.status;
...

Le code serveur ressemble à:

...
// An exception here results HTTP status codes in status1 (at client side above)
...
...
var reqDb = http.request(options, requestCompleteCallback);
...
...
function requestCompleteCallback(response) {
    ...
    // An exception here results in 0 in status1 (at client side above)
    ...
}

30 minutes de lutte pour comprendre cela.
J'espère que ce message aidera quelqu'un.

Bonne chance.

0

Parfois, le navigateur répond au gestionnaire d'erreurs http avec Error Object, dont le statut est défini sur 0, même si vous pouvez voir le statut d'erreur 404, 401, 500, etc. sur le réseau.

Cela peut arriver si votre application et votre API se trouvent sur des domaines différents: le mécanisme CORS est appliqué. Selon le CORS pour chaque requête d'API, le navigateur envoie deux requêtes:

  1. preflight OPTIONS demande à comprendre si l'API permet demande réelle/origine.
  2. lorsque l'API le permet (la requête OPTIOS répond avec le statut 204 et les en-têtes corrects Access-Control-Allow-Origin) - le navigateur envoie ensuite la "Requête réelle/d'origine".

Dans l'application, nous traitons la réponse d'erreur pour "Demande réelle/d'origine" et si "Demande d'OPTIONS de contrôle en amont" échoue - 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 la réponse à la demande de preflight de succès.

0
Dmitriy Kusch