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.

Я буквально понятия не имею, почему. Должен ли я установить определенный агент пользователя или что-то такое, чтобы сервер отвечал?

, 👍0

Обсуждение

Я предполагаю, что это пустой ответ, так как в нем говорится "Ответ" (ничего промежуточного), в то время как с других сайтов есть промежуточный ответ. Я отредактирую вопрос, чтобы прояснить его, @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


2 ответа


1

Ладно, я понятия не имею, что я изменил, кроме удаления некоторых импорта, которые могли столкнуться, но теперь это работает. Регулярный звонок с "https://www-делает дело.

В любом случае спасибо

,

Было бы лучше иметь более полный ответ, предполагая, что он может быть полезен кому-то другому. В противном случае и вопрос, и ответ, вероятно, лучше удалить., @timemage

версия с WiFiClient или версия с HttpClient?, @Juraj


0

У меня была такая же проблема, и я понял, что это потому, что я использовал WiFiClientSecure, чтобы попытаться добраться до конечной точки по HTTP вместо HTTPS. Если у кого-то еще есть такая же проблема, я бы проверил это.

,