3

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

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

4

2 回答 2

8

好吧,我自己想通了。这有几个部分,因为我看到其他人有类似的问题,我将详细介绍:

首先,我使用的是过时的 OAuthConsumer 版本。您应该使用来自 github的更新版本,而不是使用链接到 Google Code的版本,因为它包括发送包含多个字符串的多部分表单的方法。

现在,如果我没有完全错,理论上你现在应该做的是:

//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...

这将生成一个仅包含 -variables 的 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 应该如何处理的,但至少它是有效的。

于 2012-04-18T20:14:46.857 回答
1

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

于 2012-10-30T06:38:19.537 回答