OAuthConsumer – отправка изображения на сервер с помощью OAMutableURLRequest

Я использую библиотеку 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 с помощью этой библиотеки, которую я использую, или какие-либо предложения? будет большой помощью! спасибо

После возиться с порядком сортировки кода и телом 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', иначе запрос не будет отправлять какие-либо данные.

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

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

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

  • Замена стандартного UITableViewCell на пользовательскую ячейку при выборе
  • Как добавить функцию iOS «Открыть в ...» в приложении
  • UICollectionView Stacking
  • RCTBatchedBridge.m Ошибка: неверное сообщение данных - все должно быть длиной:% zd. React Native, iOS симулятор
  • Как добавить UINavigationBar полностью программно?
  • Совместное использование диалога facebook с использованием UIImage как @ "picture"
  • Сохранение двойного значения для данных ядра иногда позволяет сэкономить полностью неправильное значение
  • NSOrderedSet против NSArray indexOfObjectPassingTest:
  • Сжатый и искаженный вид после поворота устройства
  • tableView reloadData не удалит предыдущий UITextView, который программно размещен
  • Делегирование потоков ExternalAccessory не всегда вызывается в фоновом режиме
  • Давайте будем гением компьютера.