3

我正在尝试发送一个NSArray *appData,因为它NSArray包含一个NSDictionary请参阅下面的数据布局)但是当我收到时ArrayPHP所有值NSDictionary都作为单个数组发送,而不是以它们发送的相同格式(请参阅下面的 PHP 日志数据)。

中的所有其他值NSDictionary* params都已正确发送和接收。

这是我的代码中的错误还是问题?如果后者是问题,我做错了什么?

注意:我使用的是最新版本AFNetworking

编辑: 作为@dpassage答案,我进行了编辑以包括更广泛的测试并将信息发送为form-data. 测试的有趣之处在于,@"test"发送到服务器的参数显示很好,PHP但不是@"share":appData很奇怪

- (void) checkForUploadEligibility {
   NSArray* dates = [myModel getStatsMaxAndMinResults];
    if ( dates ) {
        NSDictionary* d = [dates objectAtIndex:0];
        NSDate* minDate = d[@"minDate"];
        NSDate* maxDate = d[@"maxDate"];
        NSTimeInterval secondsBetween = [maxDate timeIntervalSinceDate:minDate];

        int numberOfDays = secondsBetween / 86400;
        numberOfDays = abs(numberOfDays);

        if (numberOfDays >= 0) {
            myUser = [myModel getCurrentUser];
            if ( myUser.userWebID && myUser.authToken ) {
                NSArray* appData = [myModel getAllStatsData];
                if (!appData) {
                    return;
                }
                NSDictionary* params = @{  @"userID": myUser.userWebID,
                                       @"authCode": myUser.authToken,
                                       @"interact":@{@"action":@"uploadAppStats",
                                                     @"actionTarget":@"uploadAppStats"},
                                       @"share":appData,
                                       @"test":@[@{@"test1":@{@"test2":@"test2"}},@{@"test3":@"test3"}]
                                       };
                [myShare uploadStats:params statsData:appData];
            }

        }
    }
}
- (void) uploadStats:(NSDictionary*)params statsData:(NSArray *)statsData {
    NSLog(@"count %i, %@",[statsData count],statsData);
    NSURL *url = [[NSURL alloc]initWithString:sysURL];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:url];

    NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:sysAppURLPath parameters:params];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                                                        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){
                                                                                            NSLog(@"a: Inside the success block %@",JSON);
                                                                                            if ( [JSON objectForKey:@"ok"] ) {
                                                                                            //    [myModel deleteAllStatsData:statsData];
                                                                                            }

                                                                                        }
                                                                                        failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){

                                                                                            NSLog(@"json text is: %@", JSON);
                                                                                            NSLog(@"Request failed with error: %@, %@", error, error.userInfo);
                                                                                        }];
    // Debug HTTP response
    BOOL dbug = YES;
    if (dbug) {
        [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"HTTP r: %@",  operation.responseString);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"HTTP Error: %@",  operation.responseString);
        }
         ];
    }
    [operation start];

}

错误日志

count 5, (
        {
        date = "2013-09-09 16:10:51 +0000";
        name = selectRoutine;
        shared = 0;
        timeSpent = 3;
    },
        {
        date = "2013-09-09 16:10:53 +0000";
        name = manageExercises;
        shared = 0;
        timeSpent = 1;
    }, // MORE.....



   HTTP Error: array(24) {
      multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY
array(5) {
  ["authCode"]=>
  string(32) "e186cdd000a741ef76555009d7e86d80"
  ["interact"]=>
  array(2) {
    ["action"]=>
    string(14) "uploadAppStats"
    ["actionTarget"]=>
    string(14) "uploadAppStats"
  }
  ["share"]=>
  array(15) {
    [0]=>
    array(1) {
      ["date"]=>
      string(19) "2013-09-09 19:52:31"
    }
    [1]=>
    array(1) {
      ["name"]=>
      string(13) "selectRoutine"
    }
    [2]=>
    array(1) {
      ["timeSpent"]=>
      string(1) "3"
    }
    [3]=>
    array(1) {
      ["date"]=>
      string(19) "2013-09-09 19:52:33"
    }
    [4]=>
    array(1) {
      ["name"]=>
      string(14) "manageRoutines"
    }
    [5]=>
    array(1) {
      ["timeSpent"]=>
      string(1) "2"
    }
    [6]=>
    array(1) {
      ["date"]=>
      string(19) "2013-09-09 22:24:31"
    }
    [7]=>
    array(1) {
      ["name"]=>
      string(13) "selectRoutine"
    }
    [8]=>
    array(1) {
      ["timeSpent"]=>
      string(2) "19"
    }
    [9]=>
    array(1) {
      ["date"]=>
      string(19) "2013-09-09 22:24:45"
    }
    [10]=>
    array(1) {
      ["name"]=>
      string(14) "manageRoutines"
    }
    [11]=>
    array(1) {
      ["timeSpent"]=>
      string(2) "14"
    }
    [12]=>
    array(1) {
      ["date"]=>
      string(19) "2013-09-09 22:25:58"
    }
    [13]=>
    array(1) {
      ["name"]=>
      string(15) "manageExercises"
    }
    [14]=>
    array(1) {
      ["timeSpent"]=>
      string(2) "73"
    }
  }
  ["test"]=>
  array(2) {
    [0]=>
    array(1) {
      ["test1"]=>
      array(1) {
        ["test2"]=>
        string(5) "test2"
      }
    }
    [1]=>
    array(1) {
      ["test3"]=>
      string(5) "test3"
    }
  }
  ["userID"]=>
  string(24) "5224b598f86f265801000008"
}
4

2 回答 2

2

问题:

NSArray* appData以某种方式插入@"share":appData的内容被翻译成大量的小数组。

解决方案:

不知何故,如果我插入 a 它不会按预期工作NSArrayKey-Value NSDictionary @"share"然后我继续将其更改NSArrayNSDictionary也不起作用。

有效的是下面的代码。我不得不重新创建NSArray* appDataNSDictionary* appData2. 然后我必须将每个人的内容包装NSDictionary data object成另一个 NSDictionary人,但我必须给这个新对象一个明确的数字索引……这样做之后,它将正确地发送信息。

我想我的问题是一个错误?我真的不知道......但如果有人也有问题,这可以帮助你。

        NSArray* appData = [myModel getAllStatsData];
        if (!appData) {
            return;
        }

        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
        NSMutableDictionary* choa = [[NSMutableDictionary alloc]init];
        int i = 0;
        for (StatsAppUsage*statObj in appData) {

        [choa addEntriesFromDictionary:@{[NSNumber numberWithInteger:i]:@{@"date":[dateFormat stringFromDate:statObj.date],
                                                          @"name":statObj.name,
                                                          @"timeSpent": statObj.timeSpent
                                                          }
                          }];
            i++;
        }
        NSDictionary* appData2 = [[NSDictionary alloc]initWithDictionary:choa];
        NSDictionary* params = @{  @"userID": myUser.userWebID,
                                   @"authCode": myUser.authToken,
                                   @"interact":@{@"action":@"uploadAppStats",
                                                 @"actionTarget":@"uploadAppStats"},
                                   @"share":appData2
                                   };

@"share" PHP 输出

(
    [0] => Array
        (
            [date] => 2013-09-09 19:52:31
            [name] => selectRoutine
            [timeSpent] => 3
        )

    [1] => Array
        (
            [date] => 2013-09-09 19:52:33
            [name] => manageRoutines
            [timeSpent] => 2
        )
于 2013-09-10T09:19:05.123 回答
0

我认为问题的出现是因为您使用带有参数的默认 HTTP POST 来发送您的值。您可以通过在服务器端打印出帖子的内容类型来确认这一点;它应该是类似的东西x-www-form-urlencoded。如果是这样的话,这种数据格式就不能真正很好地表达数组和字典。所以你得到了你在服务器端看到的奇怪的格式。

您可能想要做的是将您的数据作为 JSON 发送,而不是作为纯格式参数。我相信您想要做的就是将parameterEncoding您的属性设置AFHTTPClientAFJSONParameterEncoding. 这会将您的请求作为 JSON 发送,它能够在线上正确地表示数组和字典。

于 2013-09-09T19:45:04.957 回答