2012-04-18 4 views
2

Я использую OAuthConsumer в своем приложении iOS, которое использует Tumblr API. Создание API-вызовов в целом прекрасно работает. Тем не менее, я изо всех сил пытаюсь загрузить любые медиа. Когда все параметры моих запросов являются Интс или строки, я добавляю их просто так:Загрузка изображения в tumblr с использованием OAuthConsumer для iOS

[request setParameters:[NSArray arrayWithObjects: 
         [OARequestParameter requestParameterWithName:@"x_auth_username" value:username], 
         [OARequestParameter requestParameterWithName:@"x_auth_password" value:password], 
         nil]]; 

Это, очевидно, не будет работать, например, изображений. Я понял, что мне, вероятно, придется отправить эти данные как multipart/form-data вместо application/x-www-form-urlencoded и, следовательно, это не повлияет на подпись oAuth. Однако, насколько я могу судить, OAuthConsumer поддерживает только x-www-form-urlencoded (с соответствующим кодом, лежащим в NSMutableURLRequest+Parameters.m). Однако я не уверен, правильно ли это, и если да, то я действительно не знаю, как правильно изменить Consumer. Любая помощь будет оценена!

ответ

8

Хорошо, я понял это сам. Для этого есть несколько частей, и с тех пор, как я увидел других людей, у которых есть похожие вопросы, я пойду во всю длину:

Прежде всего, я использовал устаревшую версию OAuthConsumer. Вместо того, чтобы использовать версию linked on Google Code, вы должны использовать более позднюю версию from github, так как она включает в себя средства отправки многостраничной формы с более чем строками в ней.

Теперь, если я не совсем неправильно, что вы теоретически должны делать теперь заключается в следующем:

//Setup the request... 
[request setParameters:params];  
[request attachFileWithName:@"data" filename:@"photo.jpg" contentType:@"image/jpeg" data:dataProp.data]; 
//Setup the fetcher and send the request... 

Это будет генерировать OAuth подпись, которая включает в себя только oauth_... -variables, класть все другие переменные в многочастную форму. Так должно быть и в соответствии с документацией, вы должны быть в порядке. К сожалению, вы не знаете, tumblr вернет ошибку 401, что, скорее всего, приведет к недопустимой сигнатуре.

Вот что вам действительно нужно сделать:

//Setup the request... 
[request setParameters:params]; 
[request prepare]; //Whaaaat? 
[request attachFileWithName:@"data" filename:@"photo.jpg" contentType:@"image/jpeg" data:dataProp.data]; 
//Setup the fetcher, make sure "prepare" isn't called again, send the request... 

Это будет работать ... Опять же, я уверен, что это не так, как OAuth должен справиться с этим, но по крайней мере это работает.

+2

Жаль, что я не смог проголосовать за это больше ... – coneybeare

+0

Ключом к этому для меня было «make sure» подготовить «больше не вызывается». – Alex

+0

Отлично! Это помогло мне использовать Mac OS X для доступа к Etsy API. –

1

Выполнение Tumblr OAuth довольно странно, я бы сказал. Я нашел, почему это нормально для проверки подлинности и запроса блога (see here). Как я знаю, Tumblr работает лучше с новой библиотекой OAuth (this one). Я сам бесполезно потратил некоторое время, пытаясь сделать всю работу над старым OAuth совместимым с ShareKit. Решение, которое я нашел, предлагает использовать ASIFormDataRequest и подписывать его с информацией аутентификации OAuth (originally found here). Да, это похоже на попытку скрестить ежа с змеей травы, но как-то он работает для одиночных изображений. Но, изменив этот код, я не смог загрузить несколько изображений. Другое решение - "TumblrUploadr", но оно выглядит немного слишком сырым.

Смежные вопросы