2013-05-18 36 views
8

Tôi đang tạo một ứng dụng cho iOS và tôi đang sử dụng OAuth library này. Các yêu cầu GET dường như hoạt động tốt nhưng ngay khi tôi cố thực hiện yêu cầu POST, tôi nhận được lỗi sau:Twitter OAuth 1 Yêu cầu POST không hoạt động

[code 32] Không thể xác thực bạn.

Bây giờ tôi không hoàn toàn chắc chắn điều gì đang xảy ra, vì yêu cầu POST được tạo tương tự như yêu cầu GET. Bất kỳ ý tưởng gì gây ra lỗi này?

Đây là mã tạo ra các yêu cầu:

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

Những dòng cuối cùng của mã nơi tôi đặt cơ HTTP dường như gây ra vấn đề. Khi tôi xóa các dòng

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

mọi thứ hoạt động tốt, ngoại trừ khi thông số đặc biệt lớn hơn như gửi hình ảnh được mã hóa base64, nơi hiển thị không thành công ... Tôi có thể làm gì để khắc phục sự cố này?

+0

Bạn đang sử dụng một NSURLConnection đồng bộ hoặc không đồng bộ để lấy NSURLRequest này? – ModernCarpentry

+0

@ModernCarpentry Tôi yêu cầu không đồng bộ. –

+0

@the_critic queryParameters ở đây là gì? –

Trả lời

0

tôi giải quyết vấn đề bằng cách thêm các lĩnh vực tiêu đề HTTP sau:

[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

Vâng ...

Tôi không biết nguyên nhân chính xác là gì. Can't send private message to non-follower.

Làm thế nào về API Console? Nó có thể được kiểm tra các API Twitter. có thể tốt cho bạn.

Trước tiên, bạn kiểm tra đúng API thông báo trực tiếp. và sau đó so sánh kết quả giữa Bảng điều khiển API và mã của bạn.

+0

Tôi có thể gửi tin nhắn, tôi chỉ nói rằng thủ phạm không thể là sự cho phép bởi vì nếu tôi có quyền truy cập vào tin nhắn trực tiếp thì tôi chắc chắn sẽ phải có khả năng thực hiện yêu cầu POST ... Nhưng tôi sẽ xem bảng điều khiển , điều đó có thể giúp tôi, tôi sẽ thử nó và quay lại sau. –

+0

Mọi thứ hoạt động tốt trong giao diện điều khiển ... –

+0

Bạn có thể in 'queryString' và 'request_url' khi trả về 'yêu cầu' không? Và tôi có câu hỏi! 'queryString' được mã hóa UTF8 hai lần khi phương thức nhập 'POST' thành setBody. –