【问题标题】:Restkit / AFNetworking stripping out an empty param on multipart POSTRestkit / AFNetworking 在多部分 POST 上剥离一个空参数
【发布时间】: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


【解决方案1】:

我刚刚在使用 AfNetworking2.0 时遇到了同样的问题,
我像下面这样初始化 NSMutableArray 以避免这个问题:
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[[NSNull null]]];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2014-08-03
    • 2014-02-10
    • 1970-01-01
    • 2017-11-20
    • 2021-12-22
    • 2014-07-12
    相关资源
    最近更新 更多