2012-03-07 2 views
0

저는 SO와 Google을 훑어 보았고 이에 대한 비슷한 문제를 발견하지 못했습니다. 대답이 얼굴을 응시하는 것처럼 느껴지고 다른 눈이 필요합니다.AFFormURLParameterEncoding을 사용할 때 사전의 AFHttpClient 토큰이 유효하지 않습니다.

AFNetworking을 사용하여 Stripe.com API에 연결합니다. 특히 AFHTTPClient postPath를 사용하여 데이터를 엔드 포인트로 전송합니다. 스트라이프는 요청이 application/x-www-form-urlencoded로 인코딩되어야하므로 JSON 인코딩을 사용할 수 없습니다.

내가 겪고있는 문제는 내가 Charge 객체와 Card 객체를 가지고 있다는 점입니다. 카드 충전의 속성 내가있는 NSDictionary의에 충전과 카드를 모두 변환 후 그래서 같이 요청에 매개 변수로에서 통과 (카드 1, 충전 사전의 내부 사전입니다) :

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

을 내가 할 때 그것을 변환 한 후

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

오류의 값은 특히 카드 개체의 키/값은 다음과 같습니다 AFHttpClient의 parameterEncoding 속성이 AFFormURLParameterEncoding로 설정된이, 스트라이프는이 오류를 반환합니다.

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

이있는 NSDictionary에 넣어되는 유효하지 않은 토큰을 제거하기 위해 무엇을 할에 대한 조언 : 여기 변환에 사용하는 코드는? 나는 잘못된 것에 집중하고 있습니까?

감사합니다.

답변

0

AFNetworking은 1 수준의 매개 변수를 사용하여 AFFormURLParameterEncoding 만 지원합니다.

난 그냥 다중 요청에 대해 동일한 코드를 쓰고 있어요

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

을 추가했습니다. 효과가있었습니다. 감사합니다!! –

관련 문제