Недопустимые токены AFHttpClient в словаре при использовании AFFormURLParameterEncoding - PullRequest
0 голосов
/ 07 марта 2012

Я просмотрел SO и Google и не нашел подобной проблемы в этом.Я чувствую, что ответ смотрит мне в лицо, и мне просто нужен еще один набор глаз.

Я использую AFNetworking для подключения к Stripe.com API.В частности, я использую AFHTTPClient postPath для отправки данных в конечную точку, сборы.Stripe требует, чтобы запрос был закодирован как application / x-www-form-urlencoded, поэтому я не могу использовать кодировку JSON.

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть объект Charge и объект Card,Card - это свойство Charge, и я конвертирую Charge и Card в NSDictionary (Card - это словарь внутри словаря Charge), а затем передаю их в качестве параметров запроса следующим образом:

NSDictionary *parameters = [ChargeRequest convertToDictionary:request];

[[StripeAPIClient sharedClient] postPath:@"charges" parameters:parameters 
success:^(AFHTTPRequestOperation *operation, id responseObject) 
{        
    NSLog(@"Response: %@", responseObject);
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) {        
    NSLog(@"Error: %@", [error localizedDescription]);
    NSLog(@"Response: %@", operation.responseString);
}];

КогдаЯ делаю это, когда для свойства parameterEncoding AFHttpClient установлено значение AFFormURLParameterEncoding, Stripe возвращает эту ошибку:

"error": {
    "message": "Invalid token id: {\n    \"exp_month\" = 10;\n    \"exp_year\" = 2016;\n      number = 4242111111111111;\n}",
    "type": "invalid_request_error"
}

Значения в ошибке - это, в частности, ключ / значения объекта Card после преобразования.Вот код, который я использую для преобразования:

   return [[NSDictionary alloc] initWithObjectsAndKeys:request.number, @"number", [NSNumber numberWithInt:10], @"exp_month", [NSNumber numberWithInt:2016], @"exp_year", nil];

Любой совет, что делать, чтобы избавиться от недействительных токенов, помещенных в этот NSDictionary?Я сосредоточен на неправильной вещи?

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2012

AFNetworking поддерживает только AFFormURLParameterEncoding с 1 уровнем параметров.

Я пишу исправление для этого

замените AFQueryStringFromParametersWithEncoding в AFHTTPClient на

extern NSArray * AFQueryParametersFromParametersAtBaseKeyWithEncoding(id parameters, NSString *baseKey, NSStringEncoding encoding);
extern NSArray * AFQueryParametersFromParametersDictionaryAtBaseKeyWithEncoding(NSDictionary *parameters, NSString *baseKey, NSStringEncoding encoding);
extern NSArray * AFQueryParametersFromParametersArrayAtBaseKeyWithEncoding(NSArray *parameters, NSString *baseKey, NSStringEncoding encoding);
extern NSArray * AFQueryStringComponentFromParameterAtBaseKeyWithEncoding(id parameter, NSString *key, NSStringEncoding encoding);

NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding encoding) {
    NSMutableArray *mutableParameterComponents = [NSMutableArray array];
    [mutableParameterComponents addObjectsFromArray:AFQueryParametersFromParametersAtBaseKeyWithEncoding(parameters,nil,encoding)];   
    return [mutableParameterComponents componentsJoinedByString:@"&"];
}

NSArray * AFQueryParametersFromParametersAtBaseKeyWithEncoding(id parameters, NSString *baseKey, NSStringEncoding encoding)
{
    NSMutableArray *mutableParameterComponents = [NSMutableArray array];

    if([parameters isKindOfClass:[NSDictionary class]]) {
        [mutableParameterComponents addObjectsFromArray:AFQueryParametersFromParametersDictionaryAtBaseKeyWithEncoding(parameters,baseKey,encoding)];
    }
    else if([parameters isKindOfClass:[NSArray class]]) {
        [mutableParameterComponents addObjectsFromArray:AFQueryParametersFromParametersArrayAtBaseKeyWithEncoding(parameters,baseKey,encoding)];
    }
    else {
        [mutableParameterComponents addObject:AFQueryStringComponentFromParameterAtBaseKeyWithEncoding(parameters,baseKey,encoding)];
    } 

    return mutableParameterComponents;
}

NSArray * AFQueryParametersFromParametersDictionaryAtBaseKeyWithEncoding(NSDictionary *parameters, NSString *baseKey, NSStringEncoding encoding)
{
    NSMutableArray *mutableParameterComponents = [NSMutableArray array];

    id key = nil;

    NSEnumerator *enumerator = [parameters keyEnumerator];
    while ((key = [enumerator nextObject])) {
        NSString *newKey = baseKey?[NSString stringWithFormat:@"%@[%@]",baseKey,key]:key;
        [mutableParameterComponents addObjectsFromArray:AFQueryParametersFromParametersAtBaseKeyWithEncoding([parameters valueForKey:key],newKey,encoding)];
    }

    return mutableParameterComponents;
}

NSArray * AFQueryParametersFromParametersArrayAtBaseKeyWithEncoding(NSArray *parameters, NSString *baseKey, NSStringEncoding encoding)
{
    NSMutableArray *mutableParameterComponents = [NSMutableArray array];

    for (id value in parameters) {
        NSString* newKey = [NSString stringWithFormat:@"%@[]",newKey];
        [mutableParameterComponents addObjectsFromArray:AFQueryParametersFromParametersAtBaseKeyWithEncoding(value,newKey,encoding)];
    }

    return mutableParameterComponents;
}

NSArray * AFQueryStringComponentFromParameterAtBaseKeyWithEncoding(id parameter, NSString *key, NSStringEncoding encoding)
{
    return [NSString stringWithFormat:@"%@=%@", AFURLEncodedStringFromStringWithEncoding([key description], encoding), AFURLEncodedStringFromStringWithEncoding([parameter description], encoding)];
}

I 'просто пишу один и тот же код для составных запросов и отправляю запрос на извлечение в AFNetworking

...