【发布时间】:2018-05-19 16:30:01
【问题描述】:
我正在尝试向飞利浦 Hue 网桥发送 PUT 请求,以便更改灯的当前状态。我是从我 PC 上的网络服务器执行此操作的。使用 CORS,我已经设法发送 GET 和 POST 请求,但是如果我发送 PUT,我会收到一个错误消息,提示“在 Access-Control-Allow-Methods 中找不到方法”。我很确定仅仅阻止这种方法是没有意义的。
我正在使用该代码来执行此操作,它与 GET 和 POST 的代码相同,只是不需要 if 子句。
var lightReq = new XMLHttpRequest();
if ("withCredentials" in lightReq) {
lightReq.open('PUT',stringChange,true);
if (value == false) {
lightReq.send("{\"on\":true}");
}
else {
lightReq.send("{\"on\":false}");
}
}
也许有人遇到了类似的问题并找到了解决方案,或者我应该检查一些步骤。我很高兴得到每一个帮助。
编辑2: 对于 roryhewitt,这就是您所要求的,我认为:
最好的问候, 阿德里安
【问题讨论】:
-
该错误意味着服务器(我想是 Hue 桥)正在返回一个不包含“PUT”方法的
Access-Control-Allow-Methods标头。您应该能够通过浏览器的开发人员工具验证这一点,您将在其中看到在尝试“PUT”之前(由浏览器)自动完成的飞行前 CORS 请求。 -
您的 GET 和 POST 请求有效的原因可能只是因为它们是没有任何自定义请求标头的简单请求,因此没有从您的浏览器触发 CORS 预检 OPTIONS 请求。但是跨域 PUT 请求 总是 会触发浏览器进行预检——正如 @Pointy 所说,如果 Access-Control-Allow-Methods 响应标头不包含“PUT”,这将失败。
-
添加到我的帖子中,浏览器的网络扫描仪显示应该接受 PUT 方法。还是我被误导了?
-
你用的是什么浏览器?看起来预检 CORS 响应确实包含“PUT”。
-
我在版本 51(PC)和 43(笔记本电脑)中使用 Firefox,因为我使用名为 FireHbbTV 的插件在 PC 上模拟 HbbTV 应用程序,所以需要旧版本。将来,该设置将在电视上进行。今天晚上我将尝试在第三个系统上设置它,但我不知何故怀疑它会改变任何东西......但是当它被支持时,它无法工作的原因可能是什么?
标签: javascript cors same-origin-policy philips-hue