2013-05-18 15 views
8

私はiOS向けのアプリケーションを作成していますが、これはOAuth libraryです。 GETリクエストは正常に機能しているようですが、POSTリクエストを作成しようとすると次のエラーが表示されます。Twitter OAuth 1 POST要求が機能しない

[code 32]あなたを認証できませんでした。

POSTリクエストがGETリクエストと非常によく似て生成されるので、私は何が起こっているのかよく分かりません。このエラーの原因は何ですか?ここで

が要求を生成するコードです:私は、HTTPボディを設定し、コードの

+ (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

非常に最後の行は、問題の原因になっています。私は行を削除する場合

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

すべてが、私はおそらくこの問題を解決するために何ができ...パラメータは、それは明らかに失敗するbase64でエンコードされた画像を、送信のような非常に大きなされている場合を除き、正常に動作しますか?

+0

あなたはこのNSURLRequestを取得するために、同期または非同期NSURLConnectionを使用していますか? – ModernCarpentry

+0

@ ModerCarpentry私は非同期に要求しています。 –

+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? Twitter APIをテストすることができます。多分あなたに良い。

まず、ダイレクトメッセージAPIを正しい方法でテストします。 APIコンソールとコード間の結果を比較します。

+0

私はメッセージを送信することができます。私は、直接のメッセージにアクセスできるなら、確かにPOST要求を行うことができなければならないので、犯人が許可になることはできないと言います...しかし、コンソールをチェックアウトしますそれは潜在的に私を助けることができる、私はそれを試し、後で戻ってきます。 –

+0

すべてがコンソールで正常に動作します... –

+0

'request'を返すときに 'queryString'と 'request_url'を出力できますか?私は質問があります! 'queryString'は、setBodyにメソッドタイプ 'POST'があるときにUTF8を2回エンコードしました。 –

関連する問題