我的目标是使用 HTTP 请求从 UBNT radio ( https://www.ubnt.com/ ) 获取状态数据。 Web 界面 url 格式为 http://192.168.0.120/status.cgi 。发出请求需要身份验证 cookie。使用从现有 Web 界面复制的 cookie,我能够成功检索数据。
这是我当前使用 Meteor 框架的代码。
radioHost = "http://192.168.0.120";
HTTP.call("POST", radioHost + "/login.cgi",
{
headers: {
"Content-Type": "multipart/form-data"
},
data: {
username: "ubnt",
password: "ubnt"
}
}, (err, res) = > {
if(err) return console.log(err);
var cookie = res.headers["set-cookie"][0];
HTTP.call("GET", radioHost + "/status.cgi", {
headers: {
cookie
}
}, (err, res) = > {
if(err) return console.log("Error");
console.log(res);
})
})
上面的代码成功实现了两个请求。然而,服务器使用错误的 token (“set-cookie”字符串)响应第一个。使用现有 Web 框架中的 cookie,响应是正确的。
这是一个用 Python 编写的库,我相信它可以做类似的事情。 https://github.com/zmousm/ubnt-nagios-plugins
我相信我的问题在于 HTTP 请求和 Web api 不与用户名和密码配合。
预先感谢您的帮助。
最佳答案
不建议直接对 URL 进行 POST
请求。当您打开浏览器时,您只是不直接登录。您获取页面然后提交/登录
不模拟此行为可能会影响某些站点,具体取决于服务器的工作方式。
因此,如果总是想像真实用户/浏览器一样查看模拟,请先发出 GET
请求,然后发出 POST
。
还捕获第一个 GET
请求中的所有 Cookie,然后将其传递给下一个请求
关于javascript - 如何使用 JavaScript 发出 HTTP 请求以从 Ubiquity AirMax 或 AirFibre radio 获取 status.cgi json 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49185397/