Probleme d'appel API esp8266

Bonjour à tous, je fais actuellement un journal lumineux a base esp8266 et 6 max7219, plusieurs API sont appelées pour l'heure, meteo, cours crypto qui fonctionne trés bien. Je veux rajouter le Saint du jour a feter et j'ai creer une routine ci dessous, mais ESP8266 Plante.. je trouve pas mon erreur dans l'appel de l'API. si quelqu'un pour me secourir!

const char* host2 = "nominis.cef.fr";

WiFiClientSecure Client3;
String SaintaFeter;
String line3;

void GetSaint(){
    Serial.print("connexion a ");
    Serial.println(host2);
    if (!Client3.connect(host2, 443)) {
      Serial.println("Connection au serveur echouée.");
      return;
    } else {
    Client3.print(String("GET https://nominis.cef.fr/json/saintdujour.php")); 
    Client3.println(String("HTTP/1.1"));
    Client3.print(String("Host: "));
    Client3.println(String(host2));
    Client3.println(String("Connection: close"));
    return;
  }     
        
  int repeatCounter2 = 0;
  
  while (!Client3.available() && repeatCounter2 < 10) {
    delay(500);
    Serial.println("w.");
    repeatCounter2++;
  }
  while (Client3.connected() && Client3.available()) {
    char c = Client3.read(); 
    if (c == '[' || c == ']') c = ' ';
    line3 += c;
  }
Client3.stop();
DynamicJsonBuffer jsonBuf;
JsonObject &root = jsonBuf.parseObject(line3);
 if (!root.success())
  {
    Serial.println("parseObject() failed");
    return;
  }
SaintaFeter = root["saintdujour"]["nom"].as<String>();
SaintaFeter.toLowerCase();  
Serial.println(SaintaFeter);  
}

Cela plante à quel ligne ou avec quel message?

tu es sur des lignes suivantes, jsonBuf est déclaré mais pas instancié à priori ?

A priori c'est dés :
Client3.print(String("GET https://nominis.cef.fr/json/saintdujour.php"));

Tu ne peux pas donner plus d'information :frowning:

Tu écris plein de truc sur le port série, je suppose donc qu'il reste muet?

Aprés Serial.println(host2); scrach de la pile et reboot de l'ESP

du coup client3 a été instancier, on ne voit pas l'instanciation dans le code je crois?

il manque un espace avant le HTTP/1.1 et une ligne vide

essayez

    Client3.print(F("GET https://"));
    Client3.print(host2);
    Client3.println(F("/json/saintdujour.php HTTP/1.1")); 
    Client3.print(F("Host: "));
    Client3.println(host2);
    Client3.println(F("Connection: close"));
    Client3.println();

vous avez un return ensuite, donc ce qui suit n'est jamais exécuté... (et ça tombe bien parce que ce n'est pas top... :cold_face: :innocent:)

line3 n'est jamais vidé donc va grandir grandir... et vous devriez utiliser les filtres de ArduinoJSON pour ne récupérer que ce qui vous intéresse

Idem... Vraiment gentil de se pencher sur mon probleme..
Code actuel !

const char* host2 = "nominis.cef.fr";

WiFiClientSecure Client3;
String SaintaFeter;
String line3;

void GetSaint(){
    Serial.print("connexion a ");
    Serial.println(host2);
    if (!Client3.connect(host2, 443)) {
      Serial.println("Connection au serveur echouée.");
      return;
    } else {
    Client3.print(F("GET https://"));
    Client3.print(host2);
    Client3.println(F("/json/saintdujour.php HTTP/1.1")); 
    Client3.print(F("Host: "));
    Client3.println(host2);
    Client3.println(F("Connection: close"));
    Client3.println();
    return;
  }     
        
  int repeatCounter2 = 0;
  
  while (!Client3.available() && repeatCounter2 < 10) {
    delay(500);
    Serial.println("w.");
    repeatCounter2++;
  }
  while (Client3.connected() && Client3.available()) {
    char c = Client3.read(); 
    if (c == '[' || c == ']') c = ' ';
    line3 += c;
  }
Client3.stop();
DynamicJsonBuffer jsonBuf;
JsonObject &root = jsonBuf.parseObject(line3);
 if (!root.success())
  {
    Serial.println("parseObject() failed");
    return;
  }
SaintaFeter = root["saintdujour"]["nom"].as<String>();
SaintaFeter.toLowerCase();  
Serial.println(SaintaFeter);  
}

  
  

ce return est un premier souci

Idem...

Si tu print juste la variable client3, cela donne quoi ?

0
Exception (29):

epc1=0x4021326a epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000008 depc=0x00000000

postez tout le code

Code actuel :

const char* host2 = "nominis.cef.fr";

WiFiClientSecure Client3;
String SaintaFeter;

void GetSaint(){
    Serial.print("connexion a ");
    Serial.println(host2);
    if (!Client3.connect(host2, 443)) {
      Serial.println("Connection au serveur echouée.");
    } else {
    Client3.print(F("GET https://"));
    Client3.print(host2);
    Client3.println(F("/json/saintdujour.php HTTP/1.1")); 
    Client3.print(F("Host: "));
    Client3.println(host2);
    Client3.println(F("Connection: close"));
    Client3.println();
    return;
  } 
      
  String line3;      
  int repeatCounter2 = 0;
  
  while (!Client3.available() && repeatCounter2 < 10) {
    delay(500);
    Serial.println("w.");
    repeatCounter2++;
  }
  while (Client3.connected() && Client3.available()) {
    char c = Client3.read(); 
    if (c == '[' || c == ']') c = ' ';
    line3 += c;
  }
Client3.stop();
DynamicJsonBuffer jsonBuf;
JsonObject &root = jsonBuf.parseObject(line3);
 if (!root.success())
  {
    Serial.println("parseObject() failed");
    return;
  }
SaintaFeter = root["saintdujour"]["nom"].as<String>();
SaintaFeter.toLowerCase();  
Serial.println(SaintaFeter);  
}

Il est mis dans un fichier .h pour la lisibilité de tous le code

ben nous on ne le voit pas... postez tout le code

Tenez voici un bout de code qui extrait votre saint du jour ("Bienheureuse Bénédicte" aujourd'hui)

pour rester simple j'utilise le mode "insecure" pour la connexion https, le risque et les enjeux sur cette requête étant mineurs.

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>

// A remplacer avec vos infos
const char* ssid = "***";
const char* password = "***";

const char * getSaint() {
  const size_t maxNomSaint = 64;
  static char nomSaint[maxNomSaint + 1];
  nomSaint[0] = '\0';

  if ((WiFi.status() == WL_CONNECTED)) {
    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
    client->setInsecure(); // pas de SSL
    HTTPClient https;
    if (https.begin(*client, "https://nominis.cef.fr/json/saintdujour.php")) {
      int httpCode = https.GET();
      if (httpCode > 0) {
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          StaticJsonDocument<48> filter;
          StaticJsonDocument<256> doc;
          filter["response"]["saintdujour"]["nom"] = true;
          DeserializationError error = deserializeJson(doc, https.getStream(), DeserializationOption::Filter(filter));
          if (error) {
            Serial.print(F("deserializeJson() failed: "));
            Serial.println(error.f_str());
          } else {
            const char * response_saintdujour_nom = doc["response"]["saintdujour"]["nom"];
            strncpy(nomSaint, response_saintdujour_nom, maxNomSaint);
            nomSaint[maxNomSaint] = '\0';
          }
        }
      }
      https.end();
    }
  }
  return nomSaint;
}

void setup() {
  Serial.begin(115200);
  Serial.println();

  //Connect to Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("\n\nConnecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.print("Connected ..");
  Serial.println(WiFi.localIP());

  Serial.println(getSaint());

}

void loop() {}

Merci Beaucoup! je vais l'intergrer sur mon programme et vous tiens informé. Super sympa :exclamation:

Il faut que je modifie en Arduinojson V5 car le reste de mon prg utilise cette biblio

faudrait faire l'effort de passer en V6... ça vaut le coup