2013-05-18 3 views
8

iOS 용 애플리케이션을 만들고 있는데이 코드를 사용하고 있습니다. OAuth library. GET 요청은 정상적으로 작동하지만 POST 요청을 만들 자마자 다음 오류가 발생합니다.Twitter OAuth 1 POST 요청이 작동하지 않습니다.

[코드 32] 인증 할 수 없습니다.

이제 POST 요청이 GET 요청과 매우 유사하게 생성되므로 어떤 일이 일어나는지 잘 모르겠습니다. 이 오류의 원인은 무엇입니까?

+ (NSURLRequest *)preparedRequestForPath:(NSString *)path 
           parameters:(NSDictionary *)queryParameters 
           HTTPmethod:(NSString *)HTTPmethod 
           oauthToken:(NSString *)oauth_token 
          oauthSecret:(NSString *)oauth_token_secret 
{ 
    if (!HTTPmethod 
     || !oauth_token) return nil; 



    NSMutableDictionary *allParameters = [self standardOauthParameters]; 
    allParameters[@"oauth_token"] = oauth_token; 
    if (queryParameters) [allParameters addEntriesFromDictionary:queryParameters]; 

    NSString *parametersString = CHQueryStringFromParametersWithEncoding(allParameters, NSUTF8StringEncoding); 

    NSString *request_url = API_URL; 
    if (path) request_url = [request_url stringByAppendingString:path]; 
    NSString *oauth_consumer_secret = CONSUMER_SECRET; 
    NSString *baseString = [HTTPmethod stringByAppendingFormat:@"&%@&%@", request_url.utf8AndURLEncode, parametersString.utf8AndURLEncode]; 
    NSString *secretString = [oauth_consumer_secret.utf8AndURLEncode stringByAppendingFormat:@"&%@", oauth_token_secret.utf8AndURLEncode]; 
    NSString *oauth_signature = [self.class signClearText:baseString withSecret:secretString]; 
    allParameters[@"oauth_signature"] = oauth_signature; 

    NSString *queryString; 
    if (queryParameters) queryString = CHQueryStringFromParametersWithEncoding(queryParameters, NSUTF8StringEncoding); 
    if (queryString) request_url = [request_url stringByAppendingFormat:@"?%@", queryString]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:request_url]]; 
    request.HTTPMethod = HTTPmethod; 

    NSMutableArray *parameterPairs = [NSMutableArray array]; 
    [allParameters removeObjectsForKeys:queryParameters.allKeys]; 
    for (NSString *name in allParameters) { 
     NSString *aPair = [name stringByAppendingFormat:@"=\"%@\"", [allParameters[name] utf8AndURLEncode]]; 
     [parameterPairs addObject:aPair]; 
    } 
    NSString *oAuthHeader = [@"OAuth " stringByAppendingFormat:@"%@", [parameterPairs componentsJoinedByString:@", "]]; 
    [request setValue:oAuthHeader forHTTPHeaderField:@"Authorization"]; 

    if ([HTTPmethod isEqualToString:@"POST"] 
     && queryParameters != nil) { 
     NSData *body = [queryString dataUsingEncoding:NSUTF8StringEncoding]; 
     [request setHTTPBody:body]; 
    } 

    return request; 
} 

편집

나는 HTTP 본문을 설정 코드의 맨 마지막 줄이 문제가 발생하는 것 :

다음은 요청을 생성하는 코드입니다. 나는 아마도이 문제를 해결하기 위해 무엇을 할 수 있는지

NSData *body = [queryString dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPBody:body]; 

모든 매개 변수가 분명히 실패 base64로 인코딩 된 이미지를 보내는 등의 매우 더 큰 경우를 제외하고 잘 작동 라인을 ... 제거하면?

+0

는이 NSURLRequest를 검색하는 동기 또는 비동기있는 NSURLConnection를 사용하고 있습니까 : – ModernCarpentry

+0

@ModernCarpentry 비동기 적으로 요청하고 있습니다. –

+0

@the_critic 여기에있는 queryParameters는 무엇입니까? –

답변

0

나는 다음과 같은 HTTP 헤더 필드를 추가하여 문제를 해결?
1

음 ...

나는 정확히 무엇이 원인인지 알지 못합니다. Can't send private message to non-follower.

어때 대략 API Console? Twitter API를 테스트 할 수 있습니다. 아마 너에게 좋다.

먼저 Direct Message API를 올바르게 테스트합니다. API 콘솔과 코드 간의 결과를 비교할 수 있습니다.

[request setValue:@"api.twitter.com" forHTTPHeaderField:@"X-HostCommonName"]; 
[request setValue:@"api.twitter.com" forHTTPHeaderField:@"Host"]; 
[request setValue:@"https://api.twitter.com" forHTTPHeaderField:@"X-Target-URI"]; 
[request setValue:@"Keep-Alive" forHTTPHeaderField:@"Connection"]; 
+0

메시지를 보낼 수 있는데, 직접 메시지에 대한 액세스 권한이 있으면 반드시 POST 요청을 할 수 있어야하기 때문에 범인은 권한이 될 수 없다고 말하면됩니다 ...하지만 콘솔을 체크 아웃 할 것입니다 , 잠재적으로 나를 도울 수있는, 나는 그것을 밖으로 시도하고 나중에 다시 올게. –

+0

콘솔에서 모든 것이 잘 작동합니다 ... –

+0

'request'를 반환하면 'queryString'및 'request_url'을 인쇄 할 수 있습니까? 그리고 나는 질문이있다! 'queryString'은 setBody에 'POST'메소드 유형이있을 때 UTF8을 두 번 인코딩했습니다. –

관련 문제