2013-05-18 3 views
8

Sto creando un'applicazione per iOS e sto usando questo OAuth library. Le richieste GET sembrano funzionare bene ma non appena provo a fare richieste POST ottengo il seguente errore:Twitter OAuth 1 richieste POST non funzionanti

[codice 32] Impossibile autenticarti.

Ora non sono abbastanza sicuro di ciò che sta accadendo, poiché le richieste POST sono generate in modo abbastanza simile alle richieste GET. Qualche idea su cosa sta causando questo errore?

ecco il codice che genera la richiesta:

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

Le ultimissime righe del codice in cui ho impostato il corpo HTTP sembrano causare il problema. Quando rimuovo le linee

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

Tutto funziona bene, tranne quando i parametri sono eccezionalmente grande come l'invio di un'immagine codificata base64, dove non riesce ovviamente ... Che cosa avrei potuto fare per risolvere questo problema?

+0

stai usando un NSURLConnection sincrona o asincrona per recuperare questo NSURLRequest? – ModernCarpentry

+0

@ModernCarpentry Sto richiedendo in modo asincrono. –

+0

@the_critic qual è il parametro query qui? –

risposta

0

ho risolto il problema aggiungendo il seguente campi dell'intestazione 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

Beh ...

Non so che cosa lo causa esattamente. Can't send private message to non-follower.

Che ne dici di API Console? Può essere testare le API di Twitter. forse buono per te

Prima di testare l'API di Direct Message in modo corretto. e quindi confrontare i risultati tra API Console e i tuoi codici.

+0

Sono in grado di inviare messaggi, dico solo che il colpevole non può essere il permesso perché se ho accesso ai messaggi diretti, sicuramente dovrei essere in grado di fare richieste POST ... Ma vado a dare un'occhiata alla console , che potrebbe potenzialmente aiutarmi, lo proverò e tornerò più tardi. –

+0

Tutto funziona bene nella console ... –

+0

Potresti stampare "queryString" e "request_url" quando restituisci "request"? E ho una domanda! 'queryString' ha codificato UTF8 due volte quando il tipo di metodo 'POST' è impostato su setBody. –