NSURLが404を返すかどうかを確認します
-
05-07-2019 - |
質問
(NSURLで表される)URLが使用可能かどうか、または404を返すかどうかを確認する必要があります。それを実現する最良の方法は何ですか?
可能であれば、デリゲートなしでこれを確認する方法をお勧めします。 URLに到達できるかどうかがわかるまで、プログラムの実行をブロックする必要があります。
解決
一般的なエラーはdidFailWithErrorメソッドでキャプチャできることは既にご存知かもしれませんが:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"Connection failed! Error - %@ %@",
[error localizedDescription],
[[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}
ただし404" Not Found"の場合または500" Internal Server Error" 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);
}
}
}
他のヒント
私もデリゲートを使用しないソリューションが必要だったので、ここで他の回答に示されているコードの一部を取り、私の場合にうまく機能する簡単なメソッドを作成しました(そしてあなたも探しているものかもしれません) :
-(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;
}
上記のwoodmantechからの回答を使用しましたが、他の同様の質問で見たものに基づいて、ファイル全体をダウンロードして存在するかどうかを確認しないように変更しました。
NSURLRequest
を NSMutableURLRequest
に変更し、追加しました:
[request setHTTPMethod:@"HEAD"];
これはうまくいくようです。私は最初のアプリに取り組んでいるので、実際の経験はまだありません。みんなありがとう。
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]);
次の呼び出しにより、同期接続を実現できます。
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
リクエストが行われるまでスレッドはブロックされます。
所属していません StackOverflow