Как разрешить междоменные запросы с помощью ESP8266WebServer.h? - Политика CORS: Access-Control-Allow-Origin
С nodeMCUv2 я хочу:
- запустить Wi-Fi-сервер с ESP8266WebServer.h
- обслуживать корневую HTML-страницу, которая будет взаимодействовать с ESP и получать внешние данные
Проблема: Политика CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
Попытался сделать CORS счастливым одним из следующих способов, но не помогло:
.sendHeader("Access-Control-Allow-Origin", "*");
.enableCORS(true);
#include <ESP8266WebServer.h>
ESP8266WebServer srvAmb(80);
void handleRoot(){
// srvAmb.sendHeader("Access-Control-Allow-Origin", "*");
srvAmb.enableCORS(true);
srvAmb.send(200,"text/html; charset=utf-8", myRootWebPagWithJSExternalFetch);
}
void setup(){
...
srvAmb.on("/", handleRoot);
...
Часть обслуживаемой корневой HTML-страницы:
try{
const Qresponse = await fetch( "https://zenquotes.io/api/random");
const Qdata = await Qresponse.json();
console.log(Qdata);
...
} catch (error) {
console.error(error);
}
Консольный вход в Chromium:
Доступ к извлечению по адресу https://zenquotes.io/api/random из источника 192.... был заблокирован политикой CORS: отсутствует заголовок Access-Control-Allow-Origin. запрошенный ресурс. Если непрозрачный ответ соответствует вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.
Итак, как получить внешние данные из браузера, работающего на ПК, смартфоне и т. д.?
Спасибо
PS Можно было бы попросить сервер получить данные до предоставления html-страницы, но это не работа сервера esp.
PPS У меня не было права создавать ключевые слова тегов, такие как: fetch, CORS, Allow-Origin, политика
REM: в разделе Как разрешить междоменные запросы на ESP8266WebServer
предполагается, что .sendHeader("Access-Control-Allow-Origin", "*") может быть объявлен устаревшим, но ArduinoIDE не выдает никаких предупреждений; в любом случае предложенное решение не работает.
Исходный код https://github.com/esp8266/ESPWebServer/blob/ master/src/ESP8266WebServer.cpp, метод sendHeader() в строке 238 имеет третий параметр (логический), который, если установлено значение true, помещается перед переданным именем & значение перед уже переданным заголовком, в противном случае оно помещается после, иначе важен декларативный порядок.
А именно, какой допустимый заголовок должен отправить сервер esp?? В частности, есть детали Chromium, говорится:
URL запроса: zenquotes.io/api/random
Метод запроса: GET
Код состояния: 200
Политика реферера: строгое происхождение при перекрестном происхождении
См. также: https://javascript.info/fetch-crossorigin
@user2718593, 👍0
Обсуждение1 ответ
Проблема связана с конкретным URL.
Действительно, если я поменяю API, а именно
const Qresponse = await fetch( "https://zenquotes.io/api/random" );
например:
const Qresponse = await fetch( "https://api.open-meteo.com/v1/meteofrance?latitude=49.71&longitude=4.16&daily=sunset&timezone=Europe%2FBerlin" );
тогда это работает.
Я предполагаю, что я пришел из информации об инструментах сетевой разработки в Chromium:
Политика реферера: строгое происхождение при перекрестном происхождении
утверждая строгое происхождение API zenquotes.io. Мой код сервера esp:
void handleRoot(){
srvAmb.sendHeader("Access-Control-Allow-Origin", "*", 1);
srvAmb.send(200,"text/html; charset=utf-8", myRootWebPagWithJSExternalFetch);
}
Примечание: с дополнительным третьим параметром sendHeader() или без него это работает.
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Получение всех данных моего объекта JSON из Serial.read() сразу
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Цикл foreach Arduino JSON
- Проанализировать большой ответ json с помощью ESP8266
- Публиковать данные json в mqtt
- ArduinoJSON v6 – передача буфера как параметра функции
Одна вещь, потому что в последнее время я боролся с CORS в другом контексте: вы уверены, что кеш вашего браузера здесь не мешает? У меня была проблема, что настройка разрешения происхождения на
*
не помогла, но как только я использовал другой браузер (или, в моем случае, новый профиль Firefox), он заработал., @chrisl@Крисл. НЕТ. Но мне интересно, не имеет ли это ничего общего с тем, что выборка по https, а соединение с ESP по http. ПОЛУЧИТЬ https://zenquotes.io/api/random net::ERR_FAILED 200 https://stackoverflow.com/questions/22665232/what-can-cause-chrome-to-give-an-neterr-failed-on-cached-content-against-a-ser, @user2718593
Подробности в Chromium: указано, что заголовок отсутствует: Запрос на совместное использование ресурсов между источниками (CORS) был заблокирован из-за недопустимых или отсутствующих заголовков ответа запроса или связанного запроса предварительной проверки. ... Статус запроса Предпечатный запрос (если есть проблемы) Проблема с заголовком Недопустимое значение (если доступно) случайно заблокированный заголовок Access-Control-Allow-Origin отсутствует Таким образом, он не работает так, как ожидает Chromium 107. https://web.dev/cross-origin-resource-sharing/?utm_source=devtools и https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS, @user2718593