Ios Restkit/AFKIT在多部分POST上剥离空参数
我正在尝试使用以下方法使用RestKit发布到我的Web服务:Ios Restkit/AFKIT在多部分POST上剥离空参数,ios,afnetworking,restkit-0.20,Ios,Afnetworking,Restkit 0.20,我正在尝试使用以下方法使用RestKit发布到我的Web服务: (NSMutableURLRequest *)multipartFormRequestWithObject:(id)object method:(RKRequestMethod)method path:(NSString *)path
(NSMutableURLRequest *)multipartFormRequestWithObject:(id)object
method:(RKRequestMethod)method
path:(NSString *)path
parameters:(NSDictionary *)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
******编辑*********
好的,我已经对此进行了进一步的研究,问题似乎是当参数转换为数组时。该函数递归调用自身:
[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)
看到一个空数组,因此跳过代码的其余部分。没有要添加的嵌套值。本质上,它是剥离出一个可能包含空数组的参数。下面是完整的功能
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;
}
我刚刚在使用AfNetworking2.0时遇到了同样的问题,
我像下面这样初始化NSMutableArray以避免问题:
NSMUTABLEARRY*MUTABLEARRY=[NSMUTABLEARRY arrayWithArray:@[[NSNull null]];
您在哪里发现AFNetworking
正在剥离参数?AFURLRequestSerialization
类似乎抛出了一个针对nil内容(body)的断言,但似乎正确地处理了非null但为空的body。即便如此,@“friends”:@“
不是一个可接受的解决方案吗?在我上面发布的方法中,所有键/值的参数都出现在请求中,但返回的内容不包括friends参数。我们将进一步调查。很抱歉,在这种情况下,您的注释的第二部分是不可接受的,因为它是一个数组,并且是一个字符串,JSON解析将不正确。您是否实际使用RestKit映射,这是一个问题,或者您正在调用multipartFormRequestWithObject:
并添加参数,这就是问题所在?在这两种情况下,您都不太可能使用AFN2和RK2,因为它们不兼容。请清楚您使用的是什么。@Wain RK2是否未使用AFN2?我以为是我的错,如果不是的话。我调用multipartFormRequestWithObject并将参数传递给它。在上面的函数中,它似乎是在剥离带有空数组的参数
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;
}