我正在处理与Heroku API互动的Chrome扩展程序,但似乎使用XMLHttpRequest
(XHR)发出的请求的处理方式与curl
不同。特别是,Basic Auth似乎不与XHR一起使用,而是与cookie一起使用。
所以,如果我运行以下内容:
curl https://:yourapitokengoeshere@api.heroku.com/user -H "Accept: application/json"
我没有问题就得到了正确的结果。
另一方面,如果我在我的扩展程序页面的Chrome JavaScript控制台中运行以下内容,请求的成功将取决于我是否登录到Heroku。
var xhr = new XMLHttpRequest()
xhr.open("GET", "https://api.heroku.com/user", false, "", "yourapitokengoeshere")
xhr.setRequestHeader("Accept", "application/json")
xhr.send()
如果我已登录,则会在curl
中获得与xhr.responseText
相同的结果。如果我退出了,我会GET https://:yourapitokengoeshere@api.heroku.com/user 401 (Unauthorized)
。我可以从网络选项卡中看到cookie被传递,Heroku基于它而不是作为XMLHttpRequest::open
中传递的密码传递的API令牌。 (我也尝试在不使用用户名,密码参数的情况下打开https://:yourapitokengoeshere@api.heroku.com/user
,结果相同(正如预期,但值得一试))
如果您想尝试一下,我的manifest.json
就是:
{
"name": "Testing Heroku.js",
"version": "0.1",
"background": {
"page": "test.html"
},
"permissions": [
"cookies",
"https://api.heroku.com/"
],
"manifest_version": 2
}
test.html
只是一个空文件,因此我可以打开检查视图并访问扩展程序上下文中的控制台。在任何地方创建这两个文件,并将封闭目录作为解压缩的扩展名加载。
所以我的问题是:我能做些什么吗?我错过了什么吗? Heroku API有问题吗?还是XMLHttpRequest
?我倾向于API行为不端......
更一般地说,我有兴趣了解XMLHttpRequest
通话和curl
通话之间的区别。
根据我的研究,如果没有Cookie,我似乎无法使用XMLHttpRequest
,我无法更改用户代理,使其看起来像curl
。我还尝试了一些使curl行为像XMLHttpRequest
的行为(更改用户代理,使用相同的标题),但curl
始终按预期工作。
谢谢!
答案 0 :(得分:1)
Heroku支持团队的回答:
这是Rails的怪异。直到最近,API还处理了Web UI等,因此在这种情况下,假设XHR不是API请求,而是最终用户在API网站上的请求。
希望在不久的将来,我们的API将不再与此行为相关联,并且还将作为正确的产品(具有适当的文档)宣布。
所以,问题在于API。
答案 1 :(得分:1)
您需要按如下方式生成Heroku密钥:
herokuKey = btoa(":" + herokuToken + "\n")
然后使用适当的标题发出请求。
xhr = new XMLHttpRequest()
xhr.open("GET", "https://api.heroku.com/apps")
xhr.setRequestHeader("Accept", "application/vnd.heroku+json; version=3")
xhr.setRequestHeader("Authorization", herokuKey)
xhr.send()
我将这篇文章拼凑在一起:https://devcenter.heroku.com/articles/platform-api-quickstart并使用您的示例使其适应网络。