我在iOS应用程序中使用OAuthConsumer,它使用了Tumblr API。使API调用一般工作正常。但是,我很难上传任何媒体。当我的请求的所有参数都是int或字符串时,我就像这样添加它们:
[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
。任何帮助将不胜感激!
答案 0 :(得分: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_...
- 变量,将所有其他变量放入多部分表单中。这应该是它应该如何,根据文档,你应该没事。不幸的是,你不是,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应该如何处理这个问题,但至少它是有效的。
答案 1 :(得分:1)
Tumblr对OAuth的实施很奇怪我会说。我找到了为什么它可以用于身份验证和博客请求(see here)。据我所知,Tumblr可以更好地使用新的OAuth库(this one)。我自己无用地花了一些时间试图在旧的OAuth上完成所有工作,以便与ShareKit兼容。 我发现的解决方案建议使用ASIFormDataRequest并使用OAuth身份验证信息(originally found here)对其进行签名。是的,它似乎试图用草蛇杂交刺猬,但不知何故它适用于单个图像。但是,在修改此代码后,我无法上传多个图像。 另一个解决方案是"TumblrUploadr",但看起来有点过于原始。