使用iOS的OAuthConsumer将图像上传到tumblr

我在使用Tumblr API的 iOS应用程序中使用了OAuthConsumer 。 在一般的API调用工作正常。 但是,我很难上传任何媒体。 当我的请求的所有参数都是整数或string时,我就像这样添加它们:

[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 。 任何帮助,将不胜感激!

好吧,我想出了我的自我。 这有几个部分,因为我看到其他人也有类似的问题,我会全长:

首先,我使用的是过时的OAuthConsumer版本。 不要使用在Google Code上链接的版本,而应该使用github中最近的版本,因为它包含了发送多个string的多部分表单的方法。

现在,如果我不是完全错误的话,你现在理论上应该做的是:

 //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_...variables的oAuth签名,将所有其他variables放入多部分forms。 这是应该的,根据文件,你应该没问题。 不幸的是,你不是,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应该如何处理,但至less是有效的。

Tumblr的OAuth的实现很奇怪,我会说。 我发现为什么它可以authentication和博客请求( 见这里 )。 据我所知,Tumblr与新的OAuth库( 这一个 )更好地合作。 我自己无用地花了一些时间试图使所有的旧OAuth的工作与ShareKit兼容。 我find的解决schemebuild议使用ASIFormDataRequest并使用OAuth身份validation信息( 最初在此处find )进行签名。 是的,它看起来像试图用草蛇杂交刺猬,但不知何故它适用于单一的图像。 但是,修改此代码后,我无法上传多个图像。 另一个解决scheme是“TumblrUploadr” ,但看起来有点太原始。