2015-03-26 3 views
0

У меня есть UITableViewController, и я пытаюсь получить данные JSON с url с помощью этого кода, но я получаю сообщение об ошибке. Что делать?Параметр данных AFNetworking is nil Данные JSON

AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; 
     [securityPolicy setAllowInvalidCertificates:YES]; 

     NSString *urlPath = [NSString stringWithFormat:@"http://testurl.com/api/index.php"]; 
     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

     NSDictionary *parameters = @{@"process":@"search_customer",@"page": @""}; 
     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

     [manager setSecurityPolicy:securityPolicy]; 
     manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

     [manager POST:urlPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 

      NSData *jsonData = [NSData dataWithContentsOfFile:string]; 
      NSError *error = nil; 
      NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
      self.customerCards = [NSMutableArray array]; 
      NSArray *customersArray = [dataDictionary objectForKey:@"musteri_list"]; 
      for (NSDictionary *customersDictionary in customersArray) { 
       ApiClass *customer = [ApiClass customersWithTitle:[customersDictionary objectForKey:@"adi"]]; 
       customer.tel = [customersDictionary objectForKey:@"tel"]; 

       [self.customerCards addObject:customer]; 
      } 

      NSLog(@"GET: %@", string); 
      NSLog(@"POST: %@", parameters); 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"Error: %@", error); 
     }]; 

Это блок ошибка

2015-03-26 14:27:37.656 SaphiraCrm[13770:3881729] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil' 
+0

Вы принимаете [DataDictionary objectForKey: @ "musteri_list"]; существует. Если у вас нет действительного dataDictionary, весь код под этой строкой приведет к сбою. Поэтому убедитесь, что строки, jsonData, dataDictionary и т. Д. Действительны до начала использования для условий цикла. – user3344236

+0

Также почему вы не используете 'AFJSONResponseSerializer', чтобы напрямую получить JSON. – rckoenes

+0

Попробуйте отладить его с помощью контрольных точек и проверьте, где он сбой. – Jassi

ответ

0

Okey Я понял, как я могу это сделать.

Существует мой код

AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; 
    [securityPolicy setAllowInvalidCertificates:YES]; 


    NSString *urlPath = [NSString stringWithFormat:@"http://test.com/api/index.php"]; 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    NSDictionary *parameters = @{@"process":@"search_customer",@"page": @""}; 
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

    [manager setSecurityPolicy:securityPolicy]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

    [manager POST:urlPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
     NSError *error = nil; 
     NSData *jsonData = [string dataUsingEncoding:NSUTF8StringEncoding]; 
     NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 

     self.customerCards = [NSMutableArray array]; 
     NSArray *customersArray = [dataDictionary objectForKey:@"musteri_list"]; 
     NSLog(@"%@",customersArray); 
     for (NSDictionary *customersDictionary in customersArray) { 
      ApiClass *customer = [ApiClass customersWithTitle:[customersDictionary objectForKey:@"adi"]]; 
      customer.tel = [customersDictionary objectForKey:@"tel"]; 

      [self.customerCards addObject:customer]; 

     } 
     [self.tableView reloadData]; 

     NSLog(@"GET: %@", string); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
0

Я думаю, что проблема может быть в том, что вы рассматриваете в responseObject, как если бы это был NSData, но по AFNetworkingexamples, по умолчанию AFHTTPRequestOperationManager ' s responseSerializer является AFJSONResponseSerializer, поэтому responseObject уже разобран JSON, представленный как NSDictionary (в зависимости от сериализатора).

Поэтому линия

NSString *string = [[NSString alloc] initWithData:responseObject 
             encoding:NSUTF8StringEncoding]; 

возвращает nil, что вызывает следующую строку

NSData *jsonData = [NSData dataWithContentsOfFile:string]; 

поднять исключение.

Я бы предположил, что вы проверили responseObject - это то, что вы ожидаете от него, и соответствующим образом отредактируйте свой код.

... 

[manager POST:urlPath 
    parameters:parameters 
     success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      if (responseObject) { 
       NSLog(@"Response is a %@ and contains: %@", [responseObject class], responseObject); 
       // Process responseObject according to its type 

... 

Примечание: Весьма вероятно, что выше, является лишь следствием предыдущей ошибки в том, как вы установили конфигурацию вашего seriliazer, так как вы установили сначала acceptableContentType первый, а затем переписать его по умолчанию один.

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
... 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
// this is likely to invalidate the previous, since you overwritting 
// the manager's serializer with a new one with default configuration.