Arduino ESP8266 HTTPS Request возвращает пустой ответ
Я хочу получить некоторые данные JSON с защищенного HTTPS веб-сервера с помощью ESP8266. По какой-то причине я получаю пустой ответ, я считаю, что есть ошибка при разборе запроса GET. В Chrome я получаю ответ JSON без проблем.
ПОЛУЧИТЬ запрос:
httpsClient.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
Хост и путь:
const char *host = "www.adler-mannheim.de";
const char *path = "/jsonapi/game/current";
ОБНОВЛЕНИЕ:
Я попытался получить немного JSON с другого сервера, и это сработало finde, так что я могу исключить свой код. Возясь с хозяином и путем, я наблюдаю следующее:
Имя хоста без "www" приводит к 301-му значению
Имя хоста с помощью "https://www" приводит к отсутствию соединения HTTPS вообще
Таким образом, кажется, что требуется "www", хотя это, к сожалению, приводит к пустому ответу.
Результат выглядит следующим образом:
headers received
reply was:
==========
==========
closing connection
В первом случае без использования "www" перед хостом есть некоторый 301 HTML между двумя строками "=".
Вся функция:
void connect() {
WiFiClientSecure httpsClient; //Объявить объект класса WiFiClient
Serial.println(host);
httpsClient.setInsecure();
Serial.print("HTTPS Подключение");
int r=0; //счетчик повторов
while((!httpsClient.connect(host, httpsPort)) && (r < 30)){
delay(100);
Serial.print(".");
r++;
}
if(r==30) {
Serial.println("Ошибка подключения");
}
else {
Serial.println("Подключен к сети");
}
String getData, Link;
//ПОЛУЧИТЬ данные
Serial.print("запрос URL: ");
Serial.println(host+Link);
httpsClient.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Хост: " + host + "\r\n" +
"Соединение: закрыто\r\n\r\n");
Serial.println("запрос отправлен: ");
Serial.println(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
while (httpsClient.connected()) {
String line = httpsClient.readStringUntil('\n');
if (line == "\r") {
Serial.println("заголовки получены");
break;
}
}
Serial.println("reply was:");
Serial.println("==========");
String line;
while(httpsClient.available()){
line = httpsClient.readStringUntil('\n'); //Read Line by Line
Serial.println(line); //Print response
}
Serial.println("==========");
Serial.println("закрытие соединения");
delay(2000); //ПОЛУЧЕНИЕ данных каждые 2 секунды
}
ОБНОВЛЕНИЕ 2:
Я попробовал следующий код из примеров библиотеки ESP8266HTTPClient:
void connect2() {
WiFiClientSecure client;
//client.setFingerprint(fingerprint);
client.setInsecure();
HTTPClient https;
Serial.print("[HTTPS] begin...\n");
if (https.begin(client, "https://github.com/esp8266/Arduino/issues/3417")) { // HTTPS
Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();
// HttpCode будет отрицательным при ошибке
if (httpCode > 0) {
// Заголовок / HTTP был отправлен, а заголовок ответа сервера обработан
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
// файл, найденный на сервере
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}
https.end();
} else {
Serial.printf("[HTTPS] Невозможно подключиться\n");
}
Serial.println("Wait 10s before next round...");
delay(10000);
}
Этот дает мне 200 долларов, но никакой полезной нагрузки. Другие сайты работают
ОБНОВЛЕНИЕ 3:
Я взглянул на заголовки.
https.headers()
Это дает мне 0 заголовков на каждой странице, даже если есть полезная нагрузка.
Я также поближе рассмотрел полезную нагрузку, которая возвращается из моего нужного api, и она заполнена НУЛЕМ. Странным образом это происходит только с моей нужной страницей и только с моими нужными подстраницами. Запрашиваю что-то еще на высшем уровне, например "https://www.adler-mannheim.de/jsonapi-это в основном приветственная страница в серебристую полоску, и я получаю полностью подобранную красивую полезную нагрузку HTML.
Я буквально понятия не имею, почему. Должен ли я установить определенный агент пользователя или что-то такое, чтобы сервер отвечал?
@Christopher, 👍0
Обсуждение2 ответа
Ладно, я понятия не имею, что я изменил, кроме удаления некоторых импорта, которые могли столкнуться, но теперь это работает. Регулярный звонок с "https://www-делает дело.
В любом случае спасибо
Было бы лучше иметь более полный ответ, предполагая, что он может быть полезен кому-то другому. В противном случае и вопрос, и ответ, вероятно, лучше удалить., @timemage
версия с WiFiClient или версия с HttpClient?, @Juraj
У меня была такая же проблема, и я понял, что это потому, что я использовал WiFiClientSecure,
чтобы попытаться добраться до конечной точки по HTTP вместо HTTPS. Если у кого-то еще есть такая же проблема, я бы проверил это.
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Проанализировать большой ответ json с помощью ESP8266
- ESP8266 не отвечает через случайные промежутки времени
- Код запроса ESP8266 GET -1
- esp32 http client response только 200 не получил данные после этого
Я предполагаю, что это пустой ответ, так как в нем говорится "Ответ" (ничего промежуточного), в то время как с других сайтов есть промежуточный ответ. Я отредактирую вопрос, чтобы прояснить его, @Christopher
https:// не является *частью имени хоста. Это индикатор протокола для URI., @Majenko
В ответе 301 также будет заголовок "Местоположение:", который сообщает вам реальный URI, к которому вы должны получить доступ. 301 постоянно перемещен, поэтому вы можете безопасно заменить свой URI в коде на тот, который указан в заголовке местоположения., @Majenko
301 указывает на точный URL-адрес, к которому я пытаюсь получить доступ (https://www.adler-mannheim.de/jsonapi/game/current). Он также отлично работает в браузере., @Christopher
Я думаю, вы недостаточно долго ждете ответа, @Juraj
Как мне тогда заставить его ждать дольше? Вставить задержку? Кроме того, поскольку он утверждает, что получил заголовки, ответ должен быть готов, верно?, @Christopher
Я добавил код к сообщению. Он действительно получает "полученные заголовки", поэтому я думаю, что он получил, по крайней мере, что-то, верно?, @Christopher
Другой пример функции дает мне 200, также без полезной нагрузки., @Christopher
а заголовки? существует ли тип контента или длина контента?, @Juraj
если функция https.headers() верна для проверки заголовков, то их нет., @Christopher