nodemcu esp8266 中的 CORS 问题
CORS issue in nodemcu esp8266
Response to preflight request doesn't pass access control check: No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://192.168.100.2:8100' is therefore not allowed
access. The response had HTTP status code 404.
我在尝试调用物联网 ESP8266 网络服务器中的 put/post 请求时出现上述错误。
为了解决这个问题,我尝试添加以下代码。但是没有任何效果。
server.on("/", HTTP_OPTIONS, []() {
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Allow", "HEAD,GET,PUT,POST,DELETE,OPTIONS");
server.sendHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT");
server.sendHeader("Access-Control-Allow-Headers", "X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept");
});
server.on("/testPost", HTTP_POST, testCors);
server.on("/testPut", HTTP_PUT, testCors);
在函数内部
void testCors()
{
Serial.print("HTTP Method: ");
Serial.println(server.method());
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Allow", "HEAD,GET,PUT,POST,DELETE,OPTIONS");
server.sendHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT");
server.sendHeader("Access-Control-Allow-Headers", "X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept");
server.send(200, "text/plain", "");
}
谢谢
这是对我有用的通配符路径解决方案
void config_rest_server_routing()
{
server.on("/", HTTP_GET, []() {
server.send(200, "text/html",
"Welcome to the ESP8266 REST Web Server");
});
server.on("/leds", HTTP_GET, get_leds);
server.on("/leds", HTTP_POST, testCors);
server.on("/leds", HTTP_PUT, testCors);
server.onNotFound(handleNotFound);
}
void handleNotFound()
{
if (server.method() == HTTP_OPTIONS)
{
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Access-Control-Max-Age", "10000");
server.sendHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
server.sendHeader("Access-Control-Allow-Headers", "*");
server.send(204);
}
else
{
server.send(404, "text/plain", "");
}
}
只需在每个回复前添加这一行:
server.sendHeader("Access-Control-Allow-Origin", "*");
按照其他人的建议,将 header 添加到每个请求的问题除了烦人的代码重复之外,还在于您无法将其添加到 serveStatic()
。所以我进入源代码,发现 void enableCORS(bool enable)
只需在 begin()
之前添加它,cors 现在应该适用于所有路由。
server.enableCORS(true);
server.begin();
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.100.2:8100' is therefore not allowed access. The response had HTTP status code 404.
我在尝试调用物联网 ESP8266 网络服务器中的 put/post 请求时出现上述错误。
为了解决这个问题,我尝试添加以下代码。但是没有任何效果。
server.on("/", HTTP_OPTIONS, []() {
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Allow", "HEAD,GET,PUT,POST,DELETE,OPTIONS");
server.sendHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT");
server.sendHeader("Access-Control-Allow-Headers", "X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept");
});
server.on("/testPost", HTTP_POST, testCors);
server.on("/testPut", HTTP_PUT, testCors);
在函数内部
void testCors()
{
Serial.print("HTTP Method: ");
Serial.println(server.method());
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Allow", "HEAD,GET,PUT,POST,DELETE,OPTIONS");
server.sendHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT");
server.sendHeader("Access-Control-Allow-Headers", "X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept");
server.send(200, "text/plain", "");
}
谢谢
这是对我有用的通配符路径解决方案
void config_rest_server_routing()
{
server.on("/", HTTP_GET, []() {
server.send(200, "text/html",
"Welcome to the ESP8266 REST Web Server");
});
server.on("/leds", HTTP_GET, get_leds);
server.on("/leds", HTTP_POST, testCors);
server.on("/leds", HTTP_PUT, testCors);
server.onNotFound(handleNotFound);
}
void handleNotFound()
{
if (server.method() == HTTP_OPTIONS)
{
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Access-Control-Max-Age", "10000");
server.sendHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
server.sendHeader("Access-Control-Allow-Headers", "*");
server.send(204);
}
else
{
server.send(404, "text/plain", "");
}
}
只需在每个回复前添加这一行:
server.sendHeader("Access-Control-Allow-Origin", "*");
按照其他人的建议,将 header 添加到每个请求的问题除了烦人的代码重复之外,还在于您无法将其添加到 serveStatic()
。所以我进入源代码,发现 void enableCORS(bool enable)
只需在 begin()
之前添加它,cors 现在应该适用于所有路由。
server.enableCORS(true);
server.begin();