Problème de reception de données HTTP

Bonjour à tous,

Petit problème avec mon ESP32 qui fait le rôle d'un serveur HTTP. J'ai une requête qui doit me permettre d'enregistrer un post WordPress sur mon Arduino pour pouvoir la renvoyer après sauf que j'ai un problème sur la reception des données.

Voici un exemple de donnée que j'envoie :

{
    "ID": 3543,
    "post_author": "2",
    "post_date": "2021-05-20 16:02:09",
    "post_date_gmt": "2021-05-20 14:02:09",
    "post_content": "",
    "post_title": "Choosing and implementing a mobile inspection management app in 5 steps",
    "post_excerpt": "",
    "post_status": "publish",
    "comment_status": "open",
    "ping_status": "open",
    "post_password": "",
    "post_name": "inspection-app-choice-implementation",
    "to_ping": "",
    "pinged": "",
    "post_modified": "2021-05-20 16:16:22",
    "post_modified_gmt": "2021-05-20 14:16:22",
    "post_content_filtered": "",
    "post_parent": 0,
    "guid": "http://localhost/?p=3543",
    "menu_order": 0,
    "post_type": "post",
    "post_mime_type": "",
    "comment_count": "0",
    "filter": "raw"
}

Comme vous pouvez le voir c'est du JSON, qui est envoyé depuis mon site WordPress.

Voici mon code C++ :

server.on(
      "/add_new_post", HTTP_POST, [](AsyncWebServerRequest *request) {}, NULL, [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
      {
        new_post = true;

        String response_request;
        response_request += String((char *)data);

        postTest = response_request;

        Serial.println(postTest);

        // String input;

        // DynamicJsonDocument doc(100000);

        // DeserializationError error = deserializeJson(doc, postTest.substring(0, postTest.indexOf("}")));

        // if (error)
        // {
        //   Serial.print(F("deserializeJson() failed: "));
        //   Serial.println(error.f_str());
        //   return;
        // }

        // int ID = doc["ID"];                                               // 3543
        // const char *post_author = doc["post_author"];                     // "2"
        // const char *post_date = doc["post_date"];                         // "2021-05-20 16:02:09"
        // const char *post_date_gmt = doc["post_date_gmt"];                 // "2021-05-20 14:02:09"
        // const char *post_content = doc["post_content"];                   // "[fusion_builder_container type=\"flex\" ...
        // const char *post_title = doc["post_title"];                       // "Choosing and implementing a mobile inspection management ...
        // const char *post_excerpt = doc["post_excerpt"];                   // nullptr
        // const char *post_status = doc["post_status"];                     // "publish"
        // const char *comment_status = doc["comment_status"];               // "open"
        // const char *ping_status = doc["ping_status"];                     // "open"
        // const char *post_password = doc["post_password"];                 // nullptr
        // const char *post_name = doc["post_name"];                         // "inspection-app-choice-implementation"
        // const char *to_ping = doc["to_ping"];                             // nullptr
        // const char *pinged = doc["pinged"];                               // nullptr
        // const char *post_modified = doc["post_modified"];                 // "2021-05-20 16:16:22"
        // const char *post_modified_gmt = doc["post_modified_gmt"];         // "2021-05-20 14:16:22"
        // const char *post_content_filtered = doc["post_content_filtered"]; // nullptr
        // int post_parent = doc["post_parent"];                             // 0
        // const char *guid = doc["guid"];                                   // "http://localhost/?p=3543"
        // int menu_order = doc["menu_order"];                               // 0
        // const char *post_type = doc["post_type"];                         // "post"
        // const char *post_mime_type = doc["post_mime_type"];               // nullptr
        // const char *comment_count = doc["comment_count"];                 // "0"
        // const char *filter = doc["filter"];                               // "raw"

        // Serial.println(ID);

        request->send(200, "text/plain", String(1));
        Serial.println("ajout de post");
      });

Le problème c'est que ma ligne "Serial.println(postTest);" me renvoie :#debut[object Object]fin:#�␎��I␁��|ֽuᆳ�xV����␆�?4␒��␘

Le :#debut et fin:#, c'est moi qui l'ai rajouté car ça me permet de pouvoir enlever ces caractères bizarre après mes données. Et donc mon problème est ce [object Object]

Merci

c'est quoi

(Snippets R Us!)

Un String pardon que j'ai déclaré plus haut pour pouvoir l'utiliser dans une autre requête HTTP

Quand vous faites cela

Il se peut que le caractère nul ne soit pas mis et donc il faut copier plutôt len Octets et rajouter le ’\0’ ensuite

Merci de votre réponse mais je n'ai pas compris -, pourriez-vous me fournir un exemple s'il vous plaît.

A quoi correspondent vos paramètres ?

uint8_t *data, size_t len, size_t index, size_t total

Vous avez un pointeur sur une zone de données et la longueur des données. C’est quoi index et total?

Pour transformer cette zone de donnée en chaîne de caractères il faut qu’il y ait un octet nul qui marque la fin. Rien ne dit que ce zéro soit là

(Je suis en vadrouille, pas simple de taper un code complet sur mon iPhone)

Désolé, je ne sais pas du tout à quoi corresponde ces paramètres.

C'est le code de base présenté par le développeur de la lib.

Je vais essayer d'en apprendre un peu plus.

OK en regardant de plus près il semble qu'il s'agit de gestion de réponse "découpées" (chunked)

  • data serait le pointeur vers les données du paquet en cours
  • len la taille du paquet en cours
  • index le nombre d'octets déjà envoyé concernant cette requête
  • total le nombre total d'octets qui forment la requête complète

donc lorsque le call back est appelé la première fois, si len est différent de total (ou index différent de total) c'est que la requête est incomplète et d'autres bouts vont arriver


faites une petite boucle qui imprime len octets pointés par data (on verra comme cela si le dernier est un caractère nul) et affichez aussi les autres paramètres