2012-04-18 9 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過時的版本。您應該使用更新的版本from github,而不是使用linked on 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... 

,這將產生一個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是應該如何處理這個問題,但至少它的工作原理。

+2

我希望我可以投票這更多... – coneybeare 2012-06-15 22:28:02

+0

這對我的關鍵是「確保」準備「不會再次調用」。 – Alex 2012-10-23 13:42:08

+0

太棒了!這對我來說使用Mac OS X來訪問Etsy API。 – 2016-10-13 15:06:58

1

Tumblr的OAuth實現很奇怪我會說。我找到了驗證和博客請求的原因(see here)。據我所知,Tumblr可以更好地使用新的OAuth庫(this one)。我自己無用地花了一些時間嘗試使用舊的OAuth來與ShareKit兼容。 我找到的解決方案建議使用ASIFormDataRequest並使用OAuth身份驗證信息(originally found here)對其進行簽名。是的,它看起來像試圖用草蛇雜交刺蝟,但不知何故它適用於單幅圖像。但是,修改此代碼後,我無法上傳多個圖像。 另一種解決方案是"TumblrUploadr",但它看起來有點太原始。