我正在尝试在 Android 应用中使用 Tumblr API 来授权用户并制作文字和照片帖子。我正在使用 Scribe 库。因此,我可以成功获取访问令牌并使用它来获取用户信息。我也可以毫无问题地发帖。这告诉我,我正确签署请求。
但是,我花了最后一周半的时间试图制作照片,但没有成功。我不断收到 401 错误(未经授权)我已阅读 Tumblr 支持论坛以及 Stack Overflow 上的许多帖子,但无法找到解决方案。
我不愿意包含 Jumblr 库,因为我试图让我的应用程序尽可能精简。也就是说,我查看了 Jumblr 代码并决定模仿照片帖子的发送方式(https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java)。我仍然收到完全相同的错误。
下面是我的多部分 POST 请求和我收到的响应的示例。我已经替换了博客名称,OAuth 签名,消费者密钥和令牌变量,并且为了简洁起见已删除了二进制图像数据。其他一切都没有动过。我有几个问题...
-
是否应该在 multipart 部分中包含任何其他变量? Stack Overflow 用户表示将“oauth_”签名变量放在那里可以解决他的问题。我没有成功,但也许有一些我想念的东西。
-
Jumblr 应用程序似乎没有对图像数据进行任何编码,尽管 Tumblr 文档指出它应该是 URL 编码的。现在我正在发送它,因为 Jumblr 应用程序似乎(原始二进制)。它是否正确?
-
我的请求中的其他内容看起来不正确吗?
请求:
注意:我了解到应该在没有多部分表单的情况下生成 OAuth 签名。我的代码在构建此请求时会考虑到这一点!
POST http://api.tumblr.com/v2/blog/**REMOVED**.tumblr.com/post HTTP/1.1
Content-Type: multipart/form-data, boundary=cbe6b79db1b3cbe6b79e104e
Authorization: OAuth oauth_signature="**REMOVED**", oauth_version="1.0", oauth_nonce="3181201716", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="**REMOVED**", oauth_timestamp="1388791537", oauth_token="**REMOVED**"
Content-Length: 1001
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.3; SM-N900T Build/JSS15J)
Host: api.tumblr.com
Connection: Keep-Alive
Accept-Encoding: gzip
--cbe6b79db1b3cbe6b79e104e
Content-Disposition: form-data; name="type"
photo
--cbe6b79db1b3cbe6b79e104e
Content-Disposition: form-data; name="caption"
Another pic test...
--cbe6b79db1b3cbe6b79e104e
Content-Disposition: form-data; name="data[0]"; filename="postr_media_file_1388791537-1709648435.jpg"
Content-Type: image/jpeg
---- BINARY DATA REMOVED FOR BREVITY ----
响应:
HTTP/1.1 401 Not Authorized
Server: nginx
Date: Fri, 03 Jan 2014 23:25:39 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Set-Cookie: tmgioct=52c746f34266840643527780; expires=Mon, 01-Jan-2024 23:25:39 GMT; path=/; httponly
P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
3c
{"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
1 回答
我发布了答案在“Tumblr API 讨论”谷歌集团。这就是我做的:
正确地做到这一点的关键是不只是在没有多部分表格的情况下签名!这是步骤......
添加除数据字段之外的所有字段作为常规 url 编码的 POST 正文变量
签署请求
从请求中添加的 post 变量中删除 ALL
添加多部分表单,包括此次的数据字段
有些事要考虑......
标题中的 Content-Type 应为“multipart/form-data”
所有表单部分的 Content-Disposition 应为“form-data”,当然还包括有效的“名称”属性(即类型,标题,etc...)
数据部分的 Content-Disposition 还应包含“filename”属性
应该包含 Content-Type 的唯一表单部分是数据,它应该设置为要上载的文件的 mime 类型(即“image/jpeg”)
我使用“data [3]”作为数据字段的名称。我没有用“数据”来测试它,但根据我读过的所有内容,它也应该以这种方式工作。如果你正在创建一个照片集,我相信你可以简单地添加额外的部分(即 data1。data [6],etc...)。同样,除了“data [7]”之外我还没有测试过任何东西,所以尽职尽责!! !
我没有编码二进制图像数据!在将图像添加为 POST 主体变量时,我看到人们在其他帖子中花费了相当多的时间。如果以多部分形式执行此操作,则可以跳过编码并发送原始二进制数据! ; -)
我希望这可以帮助别人!我花了两个星期的时间把头砸在随机的固体物体上试图解决这个问题。实现非常简单,但没有关于如何正确构建 POST 请求的文档。官方文档真的应该包括那个。如果我知道我上面发布的内容,我可以在几分钟而不是几周内完成!
我之前发布的最后一个请求仍然有效,但这里又是。记住我提到的关于签名的内容!
请求: