Téléchargement d'Image vers tumblr en utilisant OAuthConsumer pour iOS

J'utilise OAuthConsumer dans mon application iOS qui utilise l' API Tumblr . Faire des appels API en général fonctionne bien. Cependant, j'ai du mal à download tous les médias. Quand tous les parameters de mes requêtes sont ints ou ssortingngs, je les ajoute comme ça:

[request setParameters:[NSArray arrayWithObjects: [OARequestParameter requestParameterWithName:@"x_auth_username" value:username], [OARequestParameter requestParameterWithName:@"x_auth_password" value:password], nil]]; 

Cela ne fonctionnera évidemment pas pour les images, par exemple. J'ai compris que je devrais probablement envoyer ces données en multipart/form-data au lieu d' application/x-www-form-urlencoded et par conséquent, cela n'aura aucun effet sur la signature oAuth. Cependant, autant que je sache, l'OAuthConsumer ne supporte que x-www-form-urlencoded (avec le code correspondant dans le NSMutableURLRequest+Parameters.m ). Cependant, je ne suis pas sûr que ce soit correct et, si oui, je ne sais pas vraiment comment modifier le Consumer correctement. Toute aide serait appréciée!

Ok, je l'ai compris. Il y a plusieurs parties à cela et puisque j'ai vu d'autres personnes ayant des questions similaires, je vais aller dans toute la longueur:

Tout d'abord, j'utilisais une version obsolète de OAuthConsumer. Au lieu d'utiliser la version liée à Google Code , vous devez utiliser la version la plus récente de github car elle inclut les moyens d'envoyer un formulaire en plusieurs parties contenant plus de strings.

Maintenant, si je ne me trompe pas complètement, ce que vous devriez théoriquement faire maintenant est le suivant:

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

Cela générera une signature oAuth qui ne comprend que les oauth_... , en mettant toutes vos autres variables dans le formulaire multipart. C'est comme ça que ça devrait être et selon la documentation, ça devrait aller. Malheureusement, vous ne l'êtes pas, tumblr renverra une erreur 401, résultant le plus probablement d'une signature invalide.

Voici ce que vous devez vraiment faire:

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

Cela fonctionnera … Encore une fois, je suis à peu près sûr que ce n'est pas la façon dont oAuth est censé gérer cela, mais au less cela fonctionne.

L'implémentation de Tumblr sur OAuth est assez étrange, dirais-je. J'ai trouvé pourquoi c'est OK pour l'authentification et la request de blog ( voir ici ). Comme je le sais, Tumblr fonctionne mieux avec la nouvelle bibliothèque OAuth ( celle-ci ). J'ai moi-même inutilement passé un certain time à essayer de faire tout le travail sur le vieux OAuth pour la compatibilité avec ShareKit. La solution que j'ai trouvée suggère d'utiliser ASIFormDataRequest et de le signer avec des informations d'authentification OAuth ( trouvées à l'origine ici ). Oui, cela ressemble à essayer de croiser un hérisson avec un serpent d'herbe, mais d'une manière ou d'une autre cela fonctionne pour des images simples. Mais, après avoir modifié ce code, je n'ai pas pu download plusieurs images. Une autre solution est "TumblrUploadr" , mais elle semble un peu trop brute.