nodemcu esp8266中的CORS问题

3
当我尝试在iot ESP8266 Web服务器上调用put/post请求时,出现了上述错误。该资源未在响应中设置'Access-Control-Allow-Origin' header,因此无法从源'http://192.168.100.2:8100'访问,响应的HTTP状态码为404。为了解决这个问题,我尝试添加以下代码,但是没有任何作用。
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", "");
}

谢谢


1
我以前从未使用过这个服务器,但有一件事引起了我的注意,那就是 server.on("/")。对我来说,看起来你只配置了处理程序以处理 / 终端节点。你是否检查过函数是否被调用?如果没有,也许你需要将路径配置为某种通配符,比如 /* - Paul Samsotha
是的,没错,但我没有找到在esp8266 webserver中添加通配符路径的方法。不过我能够在notFound中实现它。 - Sachin
3个回答

11

这是适用于我自己的通配符路径解决方案

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", "");
    }
}

3

与其他人建议的在每个请求中添加标题的方法相比,除了烦人的代码重复之外,问题在于您无法将其添加到 serveStatic()。 所以我进入源代码并找到了 void enableCORS(bool enable),只需在 begin() 之前添加它,cors 现在应该适用于所有路由。

server.enableCORS(true);
server.begin();

这就是它!谢谢! - Alejandro Monsalve Krause

0

只需在每个响应之前添加以下行:

server.sendHeader("Access-Control-Allow-Origin", "*");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接