我試圖使用RestKit使用下面的方法來發布到我的web服務剝離出一個空PARAM:Restkit/AFNetworking上多POST
(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)
***** EDIT *******
確定,所以我已經進一步研究此,問題似乎是當參數被轉換爲陣列。該函數調用自身遞歸:
[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內容(主體)拋出斷言,但似乎正確地處理了非null但空的主體。即使如此,是不是'@「朋友」:@「」'一個可接受的解決方案? – SwiftArchitect
在我上面發佈的方法中,它顯示參數所有鍵/值進入請求,但返回的內容不包括朋友參數。將進一步調查。 – Michael
對不起,在這種情況下,你的評論的第二部分是不可接受的,因爲它是一個數組,這將是一個字符串,JSON解析將是不正確的。 – Michael