2013-05-18 2 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; 
} 

EDIT

Самые последние строки кода, где я создал тело HTTP-видимому, причиной проблемы. Когда я удалить строки

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

все работает отлично, за исключением того, когда параметры исключительно больше похож на посылку base64 кодированного изображения, где он явно терпит неудачу ... Что я мог сделать, чтобы это исправить?

+0

Вы с помощью синхронного или асинхронного NSURLConnection для получения этого NSURLRequest? – ModernCarpentry

+0

@ModernCarpentry Я запрашиваю асинхронно. –

+0

@the_critic, что здесь является параметром queryParameters? –

ответ

0

Я решил эту проблему, добавив следующие поля заголовка HTTP:

[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"]; 
1

Хорошо ...

Я не знаю, что именно это происходит. Can't send private message to non-follower.

Как насчет API Console? Это могут быть тестовые API Twitter. может быть, хорошо для вас.

Сначала вы тестируете Direct Message API правильно. а затем сравнить результаты между API Console и вашими кодами.

+0

Я могу отправлять сообщения, я просто говорю, что виновник не может быть разрешением, потому что, если у меня есть доступ к прямым сообщениям, то я, безусловно, должен был бы делать запросы POST ... Но я собираюсь проверить консоль , что потенциально может помочь мне, я попробую и вернусь позже. –

+0

Все работает отлично в консоли ... –

+0

Не могли бы вы напечатать 'queryString' и 'request_url' при возврате 'request'? И у меня есть вопрос! «queryString» кодирует UTF8 дважды, когда тип метода «POST» установлен в setBody. –