代码之家  ›  专栏  ›  技术社区  ›  Murat Kaya

AFNetworking数据参数为nil JSON数据

  •  0
  • Murat Kaya  · 技术社区  · 10 年前

    我有一个UITableViewController,我正在尝试使用此代码从url获取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'
    
    2 回复  |  直到 10 年前
        1
  •  0
  •   veducm    10 年前

    我认为问题可能在于你正在治疗 responseObject 就好像是 NSData ,但根据 AFNetworking examples ,默认情况下 AFHTTPRequestOperationManager responseSerializer 是一个 AFJSONResponseSerializer 所以 response对象 已解析为JSON,表示为 NSDictionary (取决于序列化程序)。

    因此

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

    回报 nil ,这将导致下一行

    NSData *jsonData = [NSData dataWithContentsOfFile:string];
    

    以引发异常。

    我建议你检查一下 response对象 是您所期望的,并相应地重构代码。

    ...
    
    [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.
    
        2
  •  0
  •   Murat Kaya    10 年前

    好的,我想好了我该怎么做。

    这是我的代码

    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);
        }];