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?
Bạn đang sử dụng một NSURLConnection đồng bộ hoặc không đồng bộ để lấy NSURLRequest này? – ModernCarpentry
@ModernCarpentry Tôi yêu cầu không đồng bộ. –
@the_critic queryParameters ở đây là gì? –