2012-03-07 2 views
0

私はSOとGoogleを調べましたが、これに似た問題は見つかりませんでした。私は答えが顔で私を見つめているように感じ、私は別の目を必要とします。AFFormURLParameterEncodingを使用しているときに、AFHttpClientが辞書のトークンを無効にしました

AFNetworkingを使用してStripe.com APIに接続しています。具体的には、AFHTTPClient postPathを使用してエンドポイントにデータを送信します。 Stripeではリクエストをapplication/x-www-form-urlencodedとしてエンコードする必要があるため、JSONエンコーディングを使用することはできません。

私が問題としているのは、私がChargeオブジェクトとCardオブジェクトを持っていることです。カードはチャージの財産であり、私はNSDictionaryの者にチャージし、カードの両方を変換した後などのようなリクエストに応じてそれらをパラメータとして渡す(カードチャージ辞書の内部辞書がある):

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

を私が行うとこれは、AFFormURLParameterEncodingに設定AFHttpClientのparameterEncodingプロパティで、ストライプは、このエラーを返します。エラーで

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

値は、それを変換した後、具体的カードオブジェクトのキー/値です。

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

このNSDictionaryの中に置かれて、無効なトークンを取り除くために何をすべきか上の任意のアドバイス:ここで私は、変換に使用するコードはありますか?私は間違ったことに焦点を当てていますか?

ありがとうございます!

答えて

0

AFNetworkingのみサポートAFFormURLParameterEncodingは1レベルのパラメータで行います。

私はちょうどマルチパート要求に同じコードを書いている

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

によってAFHTTPClientでの実装をAFQueryStringFromParametersWithEncoding置き換えるとAFNetworking

+0

にプルリクエストを送信している

の修正を書いていますありがとう。あなたが投稿した実装コードでAFQueryStringComponentFromParameterAtBaseKeyWithEncodingが不足しているようですね? –

+0

申し訳ありませんが、私はそれに –

+0

を追加しました。ありがとうございます!! –

関連する問題