我如何确定 NSData 的内容何时指示 Web 服务请求失败?

How do I figure out when the contents of NSData indicate that a webservice request has failed?

我试图在我的应用程序启动时将来自 Microsoft Web 服务调用的数据保存到一个文件中。如果应用程序能够完成网络服务请求,它会将数据存储在 NSData 对象中。假设数据已成功请求和存储,我想执行某些代码,如果 web 服务不成功,我不想执行这些代码。

我的webservice请求如下:

    NSMutableURLRequest *request1 = [[NSMutableURLRequest alloc]init];
    [request1 setURL:[NSURL URLWithString:@"---URL---"]];
    [request1 setHTTPMethod:@"GET"];

    NSURLResponse *request1Response;
    NSData *request1Handler = [NSURLConnection sendSynchronousRequest:request1 returningResponse:&request1Response error:nil];
    NSString *request1Reply = [[NSString alloc]initWithBytes:[request1Handler bytes] length:[request1Handler length] encoding:NSASCIIStringEncoding];
    NSData *data1 = [request1Reply dataUsingEncoding:NSUTF16StringEncoding];

所以基本上,响应被放入 data1 对象中。

当连接到互联网时,请求执行正常。下面的代码包含在 if(data1){ 条件中,以确保 web 服务请求在执行之前成功。问题是,当我断开与互联网的连接(并切断对该网络服务的访问)时,条件中的代码仍在执行。

我尝试将 data1 与 nil 进行比较,记录 data1 以直接比较内容等,但我收集到该 data1 对象不是 nil;它可能包含某种我迄今为止无法访问的失败消息。我可以在条件请求或 Web 服务请求本身中做什么来确定请求何时失败?

您至少应该通过填充错误指针参数来检查错误响应。

理想情况下,您应该使用不同的 API,这样您就可以访问更多详细信息,例如响应 HTTP 状态代码,您应该使用它来确定发生了什么,即使您确实获得了看起来像成功的东西.

创建一个 NSError 对象并将其作为参数传递给 sendSynchronousRequest: 方法,然后如果出现网络或其他错误,err 对象将填充错误信息,因此它不会为 nil。这意味着你可以检查 if(!err)contiune 否则有错误

检查代码:

  NSMutableURLRequest *request1 = [[NSMutableURLRequest alloc]init];
    [request1 setURL:[NSURL URLWithString:@"http://www.google.com"]];
    [request1 setHTTPMethod:@"GET"];
    //object where error will be saved 
    NSError *err;
    NSURLResponse *request1Response;
    NSData *request1Handler = [NSURLConnection sendSynchronousRequest:request1 returningResponse:&request1Response error:&err];//pass the err here by reference
    NSString *request1Reply = [[NSString alloc]initWithBytes:[request1Handler bytes] length:[request1Handler length] encoding:NSASCIIStringEncoding];
    NSData *data1 = [request1Reply dataUsingEncoding:NSUTF16StringEncoding];

然后你可以在这里查看:

if (err){
NSLog(@"error: %@", err);
}