【发布时间】:2014-07-22 01:13:59
【问题描述】:
我正在尝试使用以下方法使用 RestKit 发布到我的网络服务:
(NSMutableURLRequest *)multipartFormRequestWithObject:(id)object
method:(RKRequestMethod)method
path:(NSString *)path
parameters:(NSDictionary *)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
一切都很好,直到一个参数包含一个键/值和一个空数组。例如@"friends" : @"0 objects"
单步执行在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;
}
【问题讨论】:
-
您在哪里发现
AFNetworking正在剥离参数?AFURLRequestSerialization类似乎为 nil 内容(正文)抛出了一个断言,但似乎可以正确处理非空但为空的正文。即便如此,@"friends" : @""不是一个可以接受的解决方案吗? -
在我上面发布的方法中,显示参数所有键/值都进入请求,但返回的内容不包括朋友参数。打算进一步调查。
-
抱歉,您的评论的第二部分在这种情况下是不可接受的,因为它是一个数组,并且是一个字符串,JSON 解析不正确。
-
您实际上是在使用 RestKit 映射,这是一个问题,还是您调用
multipartFormRequestWithObject:并添加参数是问题所在?无论哪种情况,您都不太可能使用 AFN2 和 RK2,因为它们不兼容。请清楚您使用的是什么。 -
@Wain RK2 没有使用 AFN2 吗?我以为是,如果不是,我的错误。我正在调用 multipartFormRequestWithObject 并将参数传递给它。在上面的函数中,它似乎正在剥离空数组的参数
标签: ios afnetworking restkit-0.20