如何检查Objective c中是不是没有服务器响应

Posted

技术标签:

【中文标题】如何检查Objective c中是不是没有服务器响应【英文标题】:How to check if there is no server response in Objective c如何检查Objective c中是否没有服务器响应 【发布时间】:2015-09-08 08:03:02 【问题描述】:

我正在尝试访问网络服务。一切正常。但如果服务器不工作,那么我的应用程序就会崩溃。 如何处理 NO SERVER RESPONSE 。 请帮忙

这是我访问网络服务的代码。

NSMutableDictionary *get = [[NSMutableDictionary alloc]init];
[get setObject:@"0" forKey:@"unit"];
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:get options:kNilOptions error:nil];
NSString *jsonInputString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *post = [[NSString alloc]initWithFormat:@"req=%@",jsonInputString];

NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"%@",getCommunity]];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20.0];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSData *responseData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (responseData != nil) 
    NSDictionary *jsonRecieveDict = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    NSLog(@"jsonArray  =======%@",jsonRecieveDict);
 
if (error)

    UIAlertView *errorAlert = [[UIAlertView alloc]initWithTitle:@"Servor not responding" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [errorAlert show];

** 错误是因为来自服务器的无效状态码**

【问题讨论】:

如果服务器没有响应,error 将捕获您的无服务器响应。关于上面的代码,似乎有什么问题? @SahebRoy - 它在没有互联网时工作,但如果服务器关闭,应用程序崩溃。问题在于来自服务器的状态代码 【参考方案1】:
if (error != nil) 
    // Something went wrong...
    NSLog(@"Servor not responding %@",error.description);
    return;

if ([response statusCode] >= 300) 
    NSLog(@"Servor not responding, status code: %ld", (long)[response statusCode]);
    return;

第一个条件应该是错误检查,第二个如果响应来检查状态码然后只执行剩下的操作

还将NSURLResponse *response; 更改为NSHTTPURLResponse *response

OR diff 实现

NSMutableDictionary *get = [[NSMutableDictionary alloc]init];
[get setObject:@"0" forKey:@"unit"]; 

if([NSJSONSerialization isValidJSONObject:get])


//convert object to data
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:newDatasetInfo options:kNilOptions error:nil];


NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"your url"]];


[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setHTTPBody:jsonData];


NSURLSessionConfiguration *config=[NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *session=[NSURLSession sessionWithConfiguration:config];

NSURLSessionDataTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 

    if(response)
        NSString *resp = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];
        NSLog(@"Echo %@",resp);


    

    else
        NSLog(@"Timeout");

    



];
[task resume];



【讨论】:

响应状态码给我 NSURLRESPONSE 没有可见界面声明选择器状态码 加载需要 20 秒,然后显示“服务器没有响应”。因为我给了 20 秒的连接超时时间。 如何处理 你无法处理超时,如果发生超时显示警报服务器响应时间过长 我的意思是,如果服务器没有响应,那么它会立即显示一些错误。这可能吗>?

以上是关于如何检查Objective c中是不是没有服务器响应的主要内容,如果未能解决你的问题,请参考以下文章

Objective C检查元素是不是存在于Web视图中

如何在 Objective-C 中以编程方式检查协议是不是包含某些方法?

如何检查Objective C BOOL变量的真假[关闭]

objective-c 检查是不是忘记了某个/某些版本

使用objective-c检查iOS更新是不是可用?

Objective C: iOS 14 如何做网络隐私权限检查