Vérifiez si NSURL retourne 404
-
05-07-2019 - |
Question
Je dois vérifier si une URL (représentée par un NSURL) est disponible ou si elle renvoie 404. Quel est le meilleur moyen d'y parvenir?
Je préférerais un moyen de vérifier cela sans un délégué, si possible. Je dois bloquer l'exécution du programme jusqu'à ce que je sache si l'URL est accessible ou non.
La solution
Comme vous le savez peut-être déjà, une erreur générale peut être capturée par la méthode didFailWithError:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"Connection failed! Error - %@ %@",
[error localizedDescription],
[[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}
mais pour 404 "Non trouvé" ou 500 " Erreur interne du serveur " devrait pouvoir capturer à l'intérieur de la méthode didReceiveResponse:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
if ([response respondsToSelector:@selector(statusCode)])
{
int statusCode = [((NSHTTPURLResponse *)response) statusCode];
if (statusCode == 404)
{
[connection cancel]; // stop connecting; no more delegate messages
NSLog(@"didReceiveResponse statusCode with %i", statusCode);
}
}
}
Autres conseils
J'avais besoin d'une solution qui n'utilisait pas de délégué non plus, alors j'ai pris des morceaux de code montrés dans d'autres réponses ici et j'ai créé une méthode simple qui fonctionne bien dans mon cas (et qui correspond peut-être aussi à ce que vous recherchez). :
-(BOOL) webFileExists {
NSString *url = @"http://www.apple.com/somefile.html";
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"statusCode = %d", [response statusCode]);
if ([response statusCode] == 404)
return NO;
else
return YES;
}
J'ai utilisé la réponse de woodmantech ci-dessus, mais je l'ai modifiée en fonction de ce que j'ai vu sur d'autres questions similaires ici, de sorte que le fichier entier ne soit pas téléchargé pour voir s'il existe.
J'ai remplacé NSURLRequest
par NSMutableURLRequest
et ajouté:
[request setHTTPMethod:@"HEAD"];
Cela semble bien fonctionner. Je travaille sur ma première application, donc pas encore de véritable expérience. Merci à tous.
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"statusCode = %d", [response statusCode]);
Vous pouvez obtenir une connexion synchrone en appelant:
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
Votre discussion sera bloquée jusqu'à ce que la demande soit faite.