我尝试使用以下方法使用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;
}
答案 0 :(得分:0)
我刚刚使用AfNetworking2.0发现了同样的问题
我初始化NSMutableArray以避免问题:
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[[NSNull null]]];