2014-07-22 43 views
0

我試圖使用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; 
} 
+0

你在哪裏發現'AFNetworking'被剝離出的參數? 'AFURLRequestSerialization'類似乎爲nil內容(主體)拋出斷言,但似乎正確地處理了非null但空的主體。即使如此,是不是'@「朋友」:@「」'一個可接受的解決方案? – SwiftArchitect

+0

在我上面發佈的方法中,它顯示參數所有鍵/值進入請求,但返回的內容不包括朋友參數。將進一步調查。 – Michael

+0

對不起,在這種情況下,你的評論的第二部分是不可接受的,因爲它是一個數組,這將是一個字符串,JSON解析將是不正確的。 – Michael

回答

0

我只是碰到使用AfNetworking2.0同樣的問題來了,
我初始化的NSMutableArray類似下面來避免此問題:
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[[NSNull null]]];