Heroku API适用于curl,但我遇到了XMLHttpRequest的麻烦。 XHR,Heroku还是我的错?

时间:2012-10-03 15:31:10

标签: javascript heroku xmlhttprequest

我正在处理与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始终按预期工作。

谢谢!

2 个答案:

答案 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并使用您的示例使其适应网络。