OAuthConsumer - отправка изображения на сервер с помощью OAMutableURLRequest - PullRequest
2 голосов
/ 05 октября 2011

Я использую библиотеку OAuthConsumer от Джона Кросби ( ссылка на код Google )

Я успешно настроил свой проект с токеном / секретным ключом доступа и запроса для создания базового авторизованного httpзапросы с сервера (GET).Однако теперь мне нужно создать вызов, который загружает изображение на сервер ... (POST)

Насколько я выяснил, мне нужно самому определить всю httpBody (поправьте меня, если я 'м неправильно).Я нашел где-то пример кода, который добавляет данные в httpBody, но я абсолютно не знаю, что я делаю.Я сделал это так:

// create url request
urlRequest = [[[OAMutableURLRequest alloc]  initWithURL:urlToServerGoesHere 
                                            consumer:authentication.consumer
                                            token:authentication.token
                                            realm:nil
                                            signatureProvider:nil] autorelease];
// apply http method on request
[urlRequest setHTTPMethod:@"POST"];

// define boundary and content-type of file in header of request
NSString* boundary = @"----IMAGE_UPLOAD";
NSString* contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[urlRequest setValue:contentType forHTTPHeaderField:@"Content-Type"];

// Create entire body
NSMutableData* body = [NSMutableData data];

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[urlRequest setHTTPBody:body];

При применении httpBody в конце кода выше, исключение выдается внутри OAMutableRequest.Я думаю, что я что-то делаю неправильно или не установил.Кажется, это связано с массивом параметров, который я не использую ...?

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]' *** Call stack at first throw:(0   CoreFoundation                      0x00ddc5a9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x00f30313 objc_exception_throw + 44
2   CoreFoundation                      0x00dd21cc -[__NSArrayI objectAtIndex:] + 236
3   TwooWrapper                         0x0000d310 -[OAMutableURLRequest parameters] + 610
4   TwooWrapper                         0x0000d45d -[OAMutableURLRequest _signatureBaseString] + 39
5   TwooWrapper                         0x0000c619 -[OAMutableURLRequest prepare] + 213
6   TwooWrapper                         0x0000c17c -[OADataFetcher 

У кого-нибудь есть информация о том, как загрузить файл через Oauth с этой библиотекой, которую я использую,или какие-либо предложения?была бы большая помощь!ТНХ

Ответы [ 2 ]

1 голос
/ 06 октября 2011

После возни с порядком сортировки кода и тела http-запроса мне удалось заставить его работать. Вот как это выглядит:

// create URL from string
NSURL* url = [[NSURL alloc] initWithString:path];

// create url request
urlRequest = [[[OAMutableURLRequest alloc]  initWithURL:url 
                                            consumer:authentication.consumer
                                            token:authentication.token
                                            realm:nil
                                            signatureProvider:nil] autorelease];
[urlRequest prepare];
[urlRequest setHTTPMethod:@"POST"];

// define boundary and content-type of file in header of request
NSString* boundary = @"----IMAGE_UPLOAD";
NSString* contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[urlRequest setValue:contentType forHTTPHeaderField:@"Content-Type"];

// Create entire body
NSMutableData* dataRequestBody = [NSMutableData data];

[dataRequestBody appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[dataRequestBody appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[dataRequestBody appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[dataRequestBody appendData:[NSData dataWithData:imageData]];
[dataRequestBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

// add 'type' parameter to request body
[dataRequestBody appendData:[[NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\npublic\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// Write end-boundary!
[dataRequestBody appendData:[[NSString stringWithFormat:@"--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[urlRequest setHTTPBody:dataRequestBody];

// write content length of body in header!
[urlRequest setValue:[[NSNumber numberWithInt:[dataRequestBody length]] stringValue] forHTTPHeaderField:@"Content-Length"];

// do call
dataFetcher = [[OADataFetcher alloc]init];
[dataFetcher fetchDataWithRequest:urlRequest delegate:self didFinishSelector:@selector(onApiSuccess:rawData:) didFailSelector:@selector(onApiFail:rawData:)];

Я также добавил 2 строки кода, чтобы добавить в httpbody дополнительный параметр со значением «type» со значением «public». Если вы посмотрите на добавляемые данные, сначала вставьте границу, затем какой-нибудь протокол http mumbo jumbo (не забывайте о \ n \ r, которые важны) и завершите границу, чтобы отметить конец параметра.

Также важно записать длину содержимого вашего тела в заголовок http «Content-Length», иначе запрос не отправит никаких данных.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 06 октября 2011

Вы звоните [urlRequest prepare] после установки тела?

Вызовите подготовку перед настройкой тела.Это ошибка / ошибка в библиотеке, так как она ожидает, что тело будет иметь такие параметры, как foo = bar & firble = mumble, поэтому, если ваше тело не выглядит так, оно вылетит.

...