使用OAuthConsumer for iOS将图像上载到tumblr

使用OAuthConsumer for iOS将图像上载到tumblr,ios,http,oauth,tumblr,Ios,Http,Oauth,Tumblr,我在我的iOS应用程序中使用,它使用。在一般情况下进行API调用可以很好地工作。然而,我很难上传任何媒体。当我的请求的所有参数都是int或string时,我会这样添加它们: [request setParameters:[NSArray arrayWithObjects: [OARequestParameter requestParameterWithName:@"x_auth_username" value:username],

我在我的iOS应用程序中使用,它使用。在一般情况下进行API调用可以很好地工作。然而,我很难上传任何媒体。当我的请求的所有参数都是int或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
)。但是,我不确定这是否正确,如果正确,我真的不知道如何正确修改
消费者。任何帮助都将不胜感激

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

首先,我使用的是过时的OAuthConsumer版本。您应该使用较新的版本,而不是使用版本,因为它包括发送包含多个字符串的多部分表单的方法

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

//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\uu…
-变量,将所有其他变量放入多部分表单中。这就是它应该是什么样子,根据文档,你应该很好。不幸的是,您没有这样做,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不应该这样处理,但至少它可以工作。

Tumblr对oAuth的实现非常奇怪。我找到了为什么身份验证和博客请求()是可以的。据我所知,Tumblr在新的OAuth库()中工作得更好。为了与ShareKit兼容,我自己花了一些时间试图在旧OAuth上完成所有工作,但这是徒劳的。 我找到的解决方案建议使用OAuth身份验证信息()并对其进行签名。是的,它看起来像是试图将刺猬与草蛇杂交,但不知何故,它只适用于单个图像。但是,在修改此代码后,我无法上载多个图像。
另一个解决方案是,但它看起来有点太原始。

对我来说,关键是“确保不再调用“准备”。太好了!这对我使用MacOSX访问ETSYAPI很有效。