esp32、esp32_https_服务器库、自签名证书、cors和499状态代码
我正在做一个ESP32项目。我的目标之一是使用javascript fetch或XMLHttpRequest()从网站与ESP32通信 ESP32已连接到我的本地网络,我正在使用ESP32_https_服务器库。它使用浏览器指示为有效的自签名证书(但由于自签名证书而发出警告,“连接未受保护”)。该网站拥有CA证书,并且是安全的 在测试中,esp32是通过USB连接到我的电脑,理想情况下,我希望它是独立的 我遇到的问题是,我似乎无法连接到esp32。我一直收到状态码499的错误 我的问题是: 1) 如何从安全网站成功连接到esp32服务器以从esp32获取数据 2) 当esp32未通过usb电缆连接到我的电脑时,如何执行此操作 请参阅下面有关esp32设置和响应的更多信息 以下是esp32代码: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)
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;
});