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?
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.
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".
Dans le SDK iOS Lorsque le délai d’appel de votre API est expiré, vous obtenez le statut 0 pour cela.
La réponse était vide. Dans la plupart des cas, les codes seront statistiques avec 1xx, 2xx, 3xx, 4xx, 5xx.
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 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.
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é.
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.
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
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
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)
}
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.
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:
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.