esp32、esp32_https_服务器库、自签名证书、cors和499状态代码

esp32、esp32_https_服务器库、自签名证书、cors和499状态代码,https,server,esp32,self-signed-certificate,Https,Server,Esp32,Self Signed Certificate,我正在做一个ESP32项目。我的目标之一是使用javascript fetch或XMLHttpRequest()从网站与ESP32通信 ESP32已连接到我的本地网络,我正在使用ESP32_https_服务器库。它使用浏览器指示为有效的自签名证书(但由于自签名证书而发出警告,“连接未受保护”)。该网站拥有CA证书,并且是安全的 在测试中,esp32是通过USB连接到我的电脑,理想情况下,我希望它是独立的 我遇到的问题是,我似乎无法连接到esp32。我一直收到状态码499的错误 我的问题是: 1)

我正在做一个ESP32项目。我的目标之一是使用javascript fetch或XMLHttpRequest()从网站与ESP32通信

ESP32已连接到我的本地网络,我正在使用ESP32_https_服务器库。它使用浏览器指示为有效的自签名证书(但由于自签名证书而发出警告,“连接未受保护”)。该网站拥有CA证书,并且是安全的

在测试中,esp32是通过USB连接到我的电脑,理想情况下,我希望它是独立的

我遇到的问题是,我似乎无法连接到esp32。我一直收到状态码499的错误

我的问题是:

1) 如何从安全网站成功连接到esp32服务器以从esp32获取数据

2) 当esp32未通过usb电缆连接到我的电脑时,如何执行此操作

请参阅下面有关esp32设置和响应的更多信息

以下是esp32代码:

ResourceNode *nodeRoot = new ResourceNode("/", "GET", [](HTTPRequest *req, HTTPResponse *res) {
    ResourceParameters *params = req->getParams();
    std::string action = params->getRequestParameter("action");

    String aksie = action.c_str();

    Serial.println("Aksie: " + aksie);

    if (aksie != "upload_data" && aksie != "upload_current_temp")
    {
        // this should be home page displayed
        // Set the response status
        res->setStatusCode(200);
        res->setStatusText("success");
        res->println("Secure Hello World!!!");
    }
    else
    {
        // either uploads..
        processParams(aksie, res);
    }
});

secureServer->registerNode(nodeRoot);
下面是处理“上传当前温度”请求的代码:

使用时:

 const xhr = new XMLHttpRequest();
    const url = 'https://192.168.0.102/?action=upload_current_temp';

    xhr.open('GET', url);

    xhr.responseType = 'text';
    xhr.onload = function () {

        const data = xhr.response;
        console.log(data);

        if (this.readyState == 4 && this.status == 200) {
            var obj = JSON.parse(this.responseText);
            console.log("getCurTemp(), responseText: " + JSON.stringify(this.responseText, null, 2));
            currentTemperature = obj.temperature;
            console.log("current temperature: " + currentTemperature);
            document.getElementById('currentTemp').innerHTML = currentTemperature;
        }
    };
    xhr.send();
我(在opera中)遇到以下错误:

499(请求已被防病毒软件禁止)

已被CORS策略阻止:请求的资源上不存在“Access Control Allow Origin”标头

镀铬:

已被CORS策略阻止:请求的资源上不存在“Access Control Allow Origin”标头

使用这些标题(opera):

请求URL: 请求方法:获取

状态代码:499请求已被防病毒软件禁止

远程地址:192.168.0.102:443

推荐人策略:降级时无推荐人

缓存控制:无存储,无缓存,必须重新验证,最大年龄=0

连接:关闭

内容长度:52266

内容类型:text/html;字符集=utf-8

过期时间:1999年12月4日星期一21:29:02 GMT

Pragma:没有缓存

接受:/

接受编码:gzip,deflate,br

接受语言:en-US,en;q=0.9

连接:保持活力

主机:192.168.0.102

来源:

推荐人:

Sec Fetch Dest:空

秒取数模式:cors

Sec获取站点:跨站点

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.79

操作:上传当前温度

使用时:

var url = "https://192.168.0.102/?action=upload_current_temp";

    var request = new Request(url, {
        method: 'GET',
        mode: 'cors', // no-cors, *cors, same-origin
        headers: {
            'Content-Type': 'application/json'
        }
    });

    fetch(request).then(function (response) {
        // Convert to JSON
        return response.json();
    }).then(function (data) {
        console.log("temp: " + JSON.stringify(data));
        return data;
    }).catch(function (error) {
        console.log('Request failed', error)
        return 000;
    });
我在opera中遇到以下错误:

499(请求已被防病毒软件禁止)

已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

镀铬: 已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

以下是标题(opera):

1请求

51.3 KB已转移

51.0 KB资源

请求URL:

请求方法:选项

状态代码:499请求已被防病毒软件禁止

远程地址:192.168.0.102:443

推荐人策略:降级时无推荐人

缓存控制:无存储,无缓存,必须重新验证,最大年龄=0

连接:关闭

内容长度:52266

内容类型:text/html;字符集=utf-8

过期时间:1999年12月4日星期一21:29:02 GMT

Pragma:没有缓存

接受:/

接受编码:gzip,deflate,br

接受语言:en-US,en;q=0.9

访问控制请求头:内容类型

访问控制请求方法:GET

连接:保持活力

主机:192.168.0.102

来源:

推荐人:

Sec Fetch Dest:空

秒取数模式:cors

Sec获取站点:跨站点

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.79


措施:上传当前温度,CORS错误不相关。对于499或任何4xx错误,响应不包括Access Control Allow Origin响应头是正常的,这是预期的。好的,所以刚刚了解到,如果我首先在打开网站的同一浏览器实例中打开esp32的web服务器页面,那么我可以使用XMLHttpRequest()从浏览器与esp32通信。那么,如何在不打开esp32服务器页面的情况下与esp32通信呢?如果esp未连接到Pc,如何执行此操作?
 const xhr = new XMLHttpRequest();
    const url = 'https://192.168.0.102/?action=upload_current_temp';

    xhr.open('GET', url);

    xhr.responseType = 'text';
    xhr.onload = function () {

        const data = xhr.response;
        console.log(data);

        if (this.readyState == 4 && this.status == 200) {
            var obj = JSON.parse(this.responseText);
            console.log("getCurTemp(), responseText: " + JSON.stringify(this.responseText, null, 2));
            currentTemperature = obj.temperature;
            console.log("current temperature: " + currentTemperature);
            document.getElementById('currentTemp').innerHTML = currentTemperature;
        }
    };
    xhr.send();
var url = "https://192.168.0.102/?action=upload_current_temp";

    var request = new Request(url, {
        method: 'GET',
        mode: 'cors', // no-cors, *cors, same-origin
        headers: {
            'Content-Type': 'application/json'
        }
    });

    fetch(request).then(function (response) {
        // Convert to JSON
        return response.json();
    }).then(function (data) {
        console.log("temp: " + JSON.stringify(data));
        return data;
    }).catch(function (error) {
        console.log('Request failed', error)
        return 000;
    });