Restkit / AFNetworking在多部分POST上剥离了一个空参数

时间:2014-07-22 01:13:59

标签: ios afnetworking restkit-0.20

我尝试使用以下方法使用RestKit发布到我的网络服务:

(NSMutableURLRequest *)multipartFormRequestWithObject:(id)object
                                                 method:(RKRequestMethod)method
                                                   path:(NSString *)path
                                             parameters:(NSDictionary *)parameters
                              constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block

一切都很有效,直到一个参数包含一个数组为空的键/值。例如@"friends" : @"0 objects"&lt ;-(空数组)

单步执行代码AFNetworking中的这个函数即使被添加到多部分请求也会删除空参数。我怎样才能防止这种情况发生?我确定我不是唯一遇到此问题的人。我想解决方法可能是使用参数添加对API的另一个调用,但对我而言,似乎我不应该诉诸于此。

   NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) 

***** 编辑 *******

好的,所以我对此进行了进一步研究,问题似乎是将参数转换为数组时。该函数以递归方式调用自身:

 [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];

当它执行并且您有一个空数组的参数时,传递给递归调用的值是一个空数组。所以当它涉及这部分代码时:

 } else if ([value isKindOfClass:[NSArray class]]) {
            NSArray *array = value;
            for (id nestedValue in array) {
                [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
            }

for(id nestedValue in Array)看到一个空数组,因此会跳过剩下的代码。没有要添加的嵌套值。本质上它是一个可能包含空数组的参数。以下是完整功能。

NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
    NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];

    if ([value isKindOfClass:[NSDictionary class]]) {
        NSDictionary *dictionary = value;
        // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveCompare:)];

        NSArray *array = [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]];
        for (id nestedKey in array) {
            id nestedValue = [dictionary objectForKey:nestedKey];
            if (nestedValue) {
                [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
            }
        }
    } else if ([value isKindOfClass:[NSArray class]]) {
        NSArray *array = value;
        for (id nestedValue in array) {
            [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
        }
    } else if ([value isKindOfClass:[NSSet class]]) {
        NSSet *set = value;
        for (id obj in set) {
            [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)];
        }
    } else {
        [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]];
    }

    return mutableQueryStringComponents;
}

1 个答案:

答案 0 :(得分:0)

我刚刚使用AfNetworking2.0发现了同样的问题 我初始化NSMutableArray以避免问题:
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[[NSNull null]]];