developers - Carga de la imagen en tumblr con OAuthConsumer para iOS
tumblr developers (2)
Estoy usando OAuthConsumer en mi aplicación iOS que hace uso de la API de Tumblr . Hacer API-Calls en general funciona bien. Sin embargo, me cuesta subir cualquier medio. Cuando todos los parámetros de mis solicitudes son enteros o cadenas, los agrego así:
[request setParameters:[NSArray arrayWithObjects:
[OARequestParameter requestParameterWithName:@"x_auth_username" value:username],
[OARequestParameter requestParameterWithName:@"x_auth_password" value:password],
nil]];
Eso obviamente no funcionará para, por ejemplo, imágenes. Me di cuenta de que probablemente tendré que enviar estos datos como multipart/form-data
lugar de application/x-www-form-urlencoded
y, por lo tanto, no tendrá ningún efecto en la firma oAuth. Sin embargo, hasta donde puedo decir, el OAuthConsumer solo es compatible con x-www-form-urlencoded
(con el código correspondiente en el NSMutableURLRequest+Parameters.m
). Sin embargo, no estoy seguro de si esto es correcto y, de ser así, realmente no sé cómo modificar al Consumer
correctamente. ¡Cualquier ayuda sería apreciada!
La implementación de OAuth de Tumblr es bastante extraña, diría yo. Encontré por qué está bien para autenticación y solicitud de blog ( ver aquí ). Como sé, Tumblr funciona mejor con la nueva biblioteca OAuth ( esta ). Yo, inútilmente, dediqué un tiempo a intentar que todo el trabajo en OAuth antiguo fuera compatible con ShareKit. La solución que encontré sugiere utilizar ASIFormDataRequest y firmarlo con la información de autenticación OAuth (que se encuentra originalmente aquí ). Sí, parece tratar de cruzar un erizo con una serpiente de hierba, pero de alguna manera funciona para imágenes individuales. Pero, después de modificar este código, no pude subir varias imágenes. Otra solución es "TumblrUploadr" , pero parece demasiado cruda.
Ok, lo descubrí por mi cuenta. Hay varias partes de esto y dado que vi a otras personas teniendo preguntas similares, entraré en detalles:
Antes que nada, estaba usando una versión obsoleta de OAuthConsumer. En lugar de utilizar la versión que está vinculada en Google Code , debe usar la versión más reciente de github, ya que incluye los medios para enviar un formulario de varias partes con más cadenas.
Ahora, si no estoy completamente equivocado, lo que en teoría debería hacer ahora es lo siguiente:
//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...
Esto generará una firma oAuth que incluye solo las oauth_...
-variables, colocando todas sus otras variables en la forma multiparte. Así es como debería ser y de acuerdo con la documentación, debería estar bien. Desafortunadamente, no lo es, tumblr devolverá un error 401, que probablemente resulte de una firma no válida.
Esto es lo que realmente tienes que hacer:
//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...
Esto funcionará ... De nuevo, estoy bastante seguro de que no se trata de cómo se supone que OAuth debe manejar esto, pero al menos funciona.