【问题标题】:can't send PUT to Philips Hue (same origin policy)无法将 PUT 发送到 Philips Hue(同源策略)
【发布时间】: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}");
			}
		} 

也许有人遇到了类似的问题并找到了解决方案,或者我应该检查一些步骤。我很高兴得到每一个帮助。

编辑: 这是标题的屏幕截图,它表明应该接受 PUT 方法。

编辑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


【解决方案1】:

从您的屏幕截图中看起来好像这是对 POST 请求的响应(我正在寻找 Anfragemethode 字段)?

大多数 CORS 响应标头(ACAC 除外)应仅在对预检 OPTIONS 请求的响应中返回 - 如果它们在对任何其他请求的响应中返回,则它们没有“意义”。不过,这是网桥的“错误”,而不是您在浏览器代码中所做的任何事情。

无论如何,当您的 JS 代码通过 XMLHttpRequest 发出 PUT 请求时,如果您从浏览器查看网络流量,您应该会看到一个 OPTIONS 请求(CORS 预检),然后是您的 PUT 请求。如果只看到 OPTIONS 请求,能否提供该请求的响应标头?

【讨论】:

  • 我在主帖中添加了一张新图片。据我了解,应该是允许的,还是我弄错了?
  • 如果我理解您的第二个屏幕截图,顶部是 PUT 的请求标头,下部是响应标头,后面是 OPTIONS 的请求标头,对吗?因此正在发出 PUT 请求(如果预检 OPTIONS 不允许,则不会发生)。我认为这里的问题是您正在使用凭据,但您正在返回 Access-Control-Allow-Origin: * - 如果您使用凭据,则需要镜像回 EXACT 原始请求标头,例如Access-Control-Allow-Origin: http://localhost。您可以尝试将其发送回去而不是 * 吗?
  • 发回意味着我必须更改飞利浦 Hue 桥接器上的参数,正如我理解的那样。但这不是一个选项,我无法访问网桥配置。还是我误会你了?此外,我在网络服务器上从一个简单的 HTML 中尝试了它并且它可以工作,所以我想这与 FireHbbTV-Plugin 对 CORS 的限制有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2016-11-26
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多