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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top