0

我浏览了 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);
}];

当我这样做时,将 AFHttpClient 的 parameterEncoding 属性设置为 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 中的无效令牌的任何建议?我是否专注于错误的事情?

谢谢!

4

1 回答 1

0

AFNetworking 仅支持具有 1 级参数的 AFFormURLParameterEncoding。

我正在为此写一个修复程序

将 AFHTTPClient 中的 AFQueryStringFromParametersWithEncoding 实现替换为

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)];
}

我只是为多部分请求编写相同的代码并向 AFNetworking 提交拉取请求

于 2012-03-07T17:35:26.673 回答