Envoyer des données via HTTP à une API depuis le fichier main.cpp

Pour envoyer des données via HTTP à une API depuis le fichier main.cpp, voici une approche que vous pouvez suivre en utilisant la bibliothèque libcurl. Je vais vous guider à travers l'ajout de cette fonctionnalité dans votre projet.

Étapes à suivre

  1. Installer libcurl (si ce n'est pas déjà fait) :

    • Sous Linux :

        sudo apt-get install libcurl4-openssl-dev
      
    • Sous Windows :

      • Vous pouvez télécharger libcurl depuis le site officiel et l'intégrer à votre projet.
  2. Modifier main.cpp pour inclure l'envoi des données via HTTP :

    • Ajoutez l'inclusion de la bibliothèque libcurl dans main.hpp :

        #include <curl/curl.h>
      
    • Dans votre fichier main.cpp, vous pouvez ajouter une fonction pour envoyer les données via une requête POST. Voici un exemple :

        #include "main.hpp"
        #include <iostream>
        #include <curl/curl.h>
      
        // Fonction pour envoyer les données à l'API via HTTP
        void sendDataToAPI(const std::string &url, const std::string &jsonData) {
            CURL *curl;
            CURLcode res;
      
            curl_global_init(CURL_GLOBAL_DEFAULT);
            curl = curl_easy_init();
            if(curl) {
                struct curl_slist *headers = NULL;
                headers = curl_slist_append(headers, "Content-Type: application/json");
      
                curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
                curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
                curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());
      
                res = curl_easy_perform(curl);
      
                if(res != CURLE_OK) {
                    std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
                }
      
                curl_easy_cleanup(curl);
            }
      
            curl_global_cleanup();
        }
      
        int main() {
            // Vos autres codes ici
      
            std::string apiUrl = "http://votre-api-endpoint.com/data";
            std::string jsonData = "{\"key\":\"value\"}"; // Les données à envoyer
      
            // Appel de la fonction pour envoyer les données
            sendDataToAPI(apiUrl, jsonData);
      
            return 0;
        }
      
  3. Compiler et lier avec libcurl :

    • Pour compiler votre projet en utilisant g++ (par exemple sous Linux) :

        g++ -o votre_programme main.cpp -lcurl
      

Explication

  • sendDataToAPI : Cette fonction prend deux paramètres, url pour l'endpoint de l'API et jsonData pour les données que vous souhaitez envoyer. Elle utilise libcurl pour créer une requête HTTP POST et envoyer les données.

  • CURL : C'est la bibliothèque qui permet de gérer les requêtes HTTP. Elle est initialisée avec curl_global_init et nettoyée avec curl_global_cleanup.

  • Headers : Le header "Content-Type: application/json" est ajouté pour indiquer que les données envoyées sont au format JSON.

  • Postfields : Les données JSON sont définies comme le corps de la requête POST.

Résultat attendu

Quand vous exécutez ce programme, il devrait envoyer une requête POST à l'API spécifiée avec les données fournies. Si la requête échoue, un message d'erreur sera affiché.

Si vous avez des questions supplémentaires ou si vous souhaitez des ajustements spécifiques, n'hésitez pas à demander !

Intégrer les données provenant de votre application C++ dans l'API FastAPI.

1. API FastAPI

Le code de l'API FastAPI que vous avez fourni est conçu pour recevoir des données de capteurs via une requête HTTP POST, les vérifier, et les enregistrer dans une base de données SQLite. Si des valeurs anormales sont détectées, une notification est envoyée.

2. Modification du Code C++

Pour envoyer les données à l'API, nous allons ajouter une méthode dans votre code C++ pour faire une requête HTTP POST. Pour cela, nous allons utiliser libcurl, une bibliothèque populaire pour les requêtes HTTP en C++.

3. Structure du Projet C++

main.hpp

Vous n'avez peut-être pas besoin de modifier ce fichier si la logique actuelle ne nécessite pas d'implémentation spécifique pour les en-têtes.

main.cpp

Voici une version modifiée de main.cpp pour inclure l'envoi des données via HTTP POST.

#include <iostream>
#include <string>
#include <curl/curl.h>
#include "main.hpp"

// Remplacez les valeurs par vos valeurs réelles
struct SensorData {
    float water_level = 85.0;
    float caustic_soda_level = 1.5;
    float water_temperature = 50.0;
    float caustic_soda_temperature = 60.0;
    float voltage = 320.0;
};

std::string serializeSensorData(SensorData data) {
    // Convertir les données en format JSON
    std::string json = "{";
    json += "\"water_level\":" + std::to_string(data.water_level) + ",";
    json += "\"caustic_soda_level\":" + std::to_string(data.caustic_soda_level) + ",";
    json += "\"water_temperature\":" + std::to_string(data.water_temperature) + ",";
    json += "\"caustic_soda_temperature\":" + std::to_string(data.caustic_soda_temperature) + ",";
    json += "\"voltage\":" + std::to_string(data.voltage);
    json += "}";
    return json;
}

void sendSensorData(SensorData data) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        std::string json_data = serializeSensorData(data);

        curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:8000/verifier");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.c_str());

        // Définir l'en-tête Content-Type
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        res = curl_easy_perform(curl);

        if(res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        }

        curl_easy_cleanup(curl);
    }
}

int main() {
    SensorData data;

    // Exemple d'envoi de données
    sendSensorData(data);

    return 0;
}

4. Explication du Code

  • serializeSensorData : Cette fonction convertit les données des capteurs en une chaîne JSON pour l'envoyer à l'API.

  • sendSensorData : Cette fonction utilise libcurl pour envoyer une requête POST à l'API FastAPI. Les données JSON sont envoyées en tant que payload.

  • Libcurl : Si vous n'avez pas encore installé libcurl, vous pouvez l'installer sur Linux avec sudo apt-get install libcurl4-openssl-dev ou sur Windows en téléchargeant la bibliothèque à partir du site officiel.

5. Compilation

Si vous utilisez g++, compilez votre code avec:

g++ main.cpp -o main -lcurl

6. Exécution de l'Application

Lancez votre API FastAPI avec:

uvicorn your_fastapi_file:app --reload

Ensuite, exécutez votre programme C++. Il enverra les données à l'API FastAPI, qui les vérifiera et les enregistrera dans la base de données.

7. Test et Déploiement

Testez votre application pour vérifier que les données sont bien envoyées et traitées. Vous pourrez ensuite adapter ce code selon vos besoins spécifiques et déployer votre API sur un serveur si nécessaire.