3

我正在尝试获取此页面 (http://www.sanmarinocard.sm) 的源代码,但 dataWithContentsOfURL 不检索数据。

NSURL *url = [NSURL URLWithString:@"http://www.sanmarinocard.sm"];
NSData *responseData = [NSData dataWithContentsOfURL:url];
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

直到几天前一切正常,但从昨天开始没有结果。

你能帮助我吗?谢谢你。

4

3 回答 3

5

是的,它也对我有用。也许服务器暂时不可用。

不建议使用 dataWithContentsOfURL: 因为它是同步的并且会阻止您的应用程序正常工作;如果服务器没有响应,它可能会在很长一段时间内阻止您的应用程序。

首选方法是使用 NSMutableURLRequest 并发送异步请求。这将使您的应用程序在加载时保持响应,还可以让您设置超时间隔并更轻松地处理任何错误。

NSURL *url = [NSURL URLWithString:@"http://www.sanmarinocard.sm"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval: 10.0]; // Will timeout after 10 seconds
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue currentQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

    if (data != nil && error == nil)
    {
        NSString *sourceHTML = [[NSString alloc] initWithData:data];
        // It worked, your source HTML is in sourceHTML
    }
    else
    {
        // There was an error, alert the user
    }

   }];
于 2013-01-20T12:15:07.890 回答
3

我发现我的应用程序通过过滤用户代理被站点阻止。我更改了值,现在它可以完美运行。

我修改了这样的代码:

NSString *userAgent = @"Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)";
NSURL *url = [NSURL URLWithString: @"http://www.sanmarinocard.sm"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

谢谢!

于 2013-01-21T22:36:42.237 回答
1

现在,它工作正常。可能由于临时服务器不可用而发生错误。

此外,如前所述,NSUTF8StringEncoding强烈推荐使用。

编辑:

它也可以与缓存有关:dataWithContentsOfURL:在后台使用 NSURLConnection,默认情况下缓存响应。看到这个问题如何忽略它。

于 2013-01-20T12:02:24.503 回答