我正在尝试在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签名,消费者密钥和令牌变量,并且为了简洁起见已删除了二进制图像数据。其他一切都没有动过。我有几个问题......
是否还应包含其他变量 多部分? 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":[]}
答案 0 :(得分:2)
我posted the answer谷歌集团。这就是我所做的:
正确执行此操作的关键是 NOT ,只需在没有多部分表单的情况下进行签名!以下是步骤......
要考虑的一些事情......
我希望这有助于某人!我花了两个星期的时间将头撞在随意的固体物体上,试图解决这个问题。实现非常简单,但没有关于如何正确构建POST请求的文档。官方文档真的应该包括那个。如果我知道我上面发布的内容,我可以在几分钟而不是几周内完成!
我之前发布的最后一个请求仍然有效,但这里又是。记住我提到的关于签名的内容!!!
请求:强>
POST http://api.tumblr.com/v2/blog/REMOVED.tumblr.com/post HTTP/1.1
Content-Type: multipart/form-data, boundary=c60f7c041c02c60f7c046e9b
Authorization: OAuth oauth_signature="***REMOVED***", oauth_version="1.0", oauth_nonce="315351812", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="***REMOVED***", oauth_timestamp="1388785116", 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
--c60f7c041c02c60f7c046e9b
Content-Disposition: form-data; name="type"
photo
--c60f7c041c02c60f7c046e9b
Content-Disposition: form-data; name="caption"
Another pic test...
--c60f7c041c02c60f7c046e9b
Content-Disposition: form-data; name="data[0]"; filename="postr_media_file_1388785116-1709648435.jpg"
Content-Type: image/jpeg
***** BINARY DATA REMOVED FOR BREVITY *****
--c60f7c041c02c60f7c046e9b--