Domanda

Devo verificare se un URL (rappresentato da un NSURL) è disponibile o restituisce 404. Qual è il modo migliore per ottenerlo?

Preferirei un modo per verificarlo senza un delegato, se possibile. Devo bloccare l'esecuzione del programma finché non so se l'URL è raggiungibile o meno.

È stato utile?

Soluzione

Come forse già sapete, l'errore generale può essere catturato dal metodo didFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

ma per 404 "Non trovato" o 500 "Errore interno del server" dovrebbe essere in grado di catturare all'interno del metodo 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);
        }
    }
}

Altri suggerimenti

Avevo bisogno di una soluzione che non usasse neanche un delegato, quindi ho preso pezzi di codice mostrati in altre risposte qui e ho creato un metodo semplice che funziona bene nel mio caso (e potrebbe essere anche quello che stai cercando) :

    -(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;
     }

Ho usato la risposta di woodmantech sopra, ma l'ho cambiata in base a quello che ho visto su altre domande simili qui in modo che non scarichi l'intero file per vedere se esiste.

Ho modificato NSURLRequest in NSMutableURLRequest e ho aggiunto:

[request setHTTPMethod:@"HEAD"];

Questo sembra funzionare bene. Sto lavorando alla mia prima app, quindi ancora nessuna esperienza reale. Grazie a tutti.

 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]);

Puoi ottenere una connessione sincrona chiamando:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Il thread verrà bloccato fino a quando non sarà stata effettuata la richiesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top