Maison >développement back-end >C++ >Consommer des API en C : un guide pratique pour les développeurs modernes
Aujourd'hui, consommer des API web est une pratique courante pour échanger des données entre applications. Les didacticiels sur l'utilisation des API dans des langages comme JavaScript, Python ou PHP sont nombreux, mais le C, souvent associé à la programmation au niveau système, est rarement envisagé à cette fin. Cependant, le C est parfaitement capable de gérer les requêtes API, ce qui en fait un choix viable pour des scénarios tels que les systèmes de point de vente (PoS), les appareils IoT ou les applications embarquées, où le C est déjà utilisé pour son efficacité et son contrôle de bas niveau.
Cet article explore comment consommer des API en C, en tirant parti de la bibliothèque libcurl. À la fin, vous comprendrez comment récupérer et traiter des données à partir d'API à l'aide de C, et pourquoi cette approche est pertinente même dans le développement moderne.
Bien que les langages de niveau supérieur dominent le développement Web, le C reste un choix pratique pour utiliser des API dans des cas d'utilisation spécifiques :
Pour consommer des API en C, libcurl est la bibliothèque incontournable. Il s'agit d'une bibliothèque open source, portable et riche en fonctionnalités permettant de gérer les requêtes réseau via HTTP, HTTPS, FTP, etc. Il prend en charge :
Parcourons le processus de consommation d'une API à l'aide de C, en nous concentrant sur un exemple concret de récupération de données JSON.
Pour utiliser libcurl, vous devez l'installer sur votre système. Pour la plupart des distributions Linux, cela peut être fait avec :
sudo apt-get install libcurl4-openssl-dev
Sous Windows, vous pouvez télécharger des binaires précompilés depuis le site Web de libcurl : https://curl.se/download.html
Sur macOS si vous utilisez Homebrew vous pouvez l'installer via
brew install curl
Un programme C simple pour récupérer des données à partir d'une API implique les composants suivants :
Voici un exemple de programme pour récupérer des données JSON à partir d'une API publique :
sudo apt-get install libcurl4-openssl-dev
Enregistrez le code dans un fichier, par exemple get.c.
Compilez-le avec la commande suivante :
brew install curl
Exécutez le programme compilé :
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> // Struct to hold response data struct Memory { char *response; size_t size; }; // Callback function to handle the data received from the API static size_t ResponseCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t totalSize = size * nmemb; struct Memory *mem = (struct Memory *)userp; printf(". %zu %zu\n", size, nmemb); char *ptr = realloc(mem->response, mem->size + totalSize + 1); if (ptr == NULL) { printf("Not enough memory to allocate buffer.\n"); return 0; } mem->response = ptr; memcpy(&(mem->response[mem->size]), contents, totalSize); mem->size += totalSize; mem->response[mem->size] = '<pre class="brush:php;toolbar:false">gcc get.c -o get -lcurl'; return totalSize; } int main() { CURL *curl; CURLcode res; struct Memory chunk; chunk.response = malloc(1); // Initialize memory chunk.size = 0; // No data yet curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (curl) { // Set URL of the API endpoint char access_token[] = "your-access-token"; char slug[] = "home"; char version[]= "draft"; char url[256]; snprintf(url, sizeof(url), "https://api.storyblok.com/v2/cdn/stories/%s?version=%s&token=%s", slug, version, access_token); // Print the URL printf("URL: %s\n", url); // initializing libcurl // setting the URL curl_easy_setopt(curl, CURLOPT_URL, url ); // Follow redirect curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // Set callback function to handle response data curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ResponseCallback); // Pass the Memory struct to the callback function curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); // Perform the HTTP GET request res = curl_easy_perform(curl); // Check for errors if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { printf("Response data size: %zu\n", chunk.size); //printf("Response data: \n%s\n", chunk.response); } // Cleanup curl_easy_cleanup(curl); } // Free allocated memory free(chunk.response); curl_global_cleanup(); return 0; }
Lorsque vous travaillez avec libcurl pour gérer les réponses HTTP en C, il est important de comprendre le comportement de la fonction de rappel. La fonction de rappel que vous définissez pour traiter les données de réponse, telle que la fonction ResponseCallback, peut être invoquée plusieurs fois pour une seule réponse HTTP. Voici pourquoi et comment cela fonctionne.
Le mécanisme de rappel de libcurl est conçu pour gérer les données de manière efficace et flexible. Au lieu d'attendre que la réponse entière soit téléchargée avant de la traiter, libcurl traite la réponse en morceaux plus petits, appelant votre fonction de rappel à mesure que chaque morceau est reçu.
Ce comportement permet :
Comment ça marche ?
Chaque fois qu'un morceau de données est reçu du serveur, libcurl appelle votre fonction de rappel. La taille de chaque morceau dépend des conditions du réseau, de la taille des tampons et de la logique interne de libcurl.
Le rappel doit accumuler les morceaux, pour finalement reconstruire la réponse complète.
Voici un exemple de séquence :
Le ResponseCallback est la fonction appelée lorsque les données sont reçues par libcurl.
sudo apt-get install libcurl4-openssl-dev
brew install curl
Ceci calcule la taille totale du bloc de données actuel reçu en multipliant la taille d'un bloc (size) par le nombre de blocs (nmemb).
Par exemple, si le serveur envoie 8 blocs de 256 octets chacun, totalSize sera de 8 * 256 = 2048 octets.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> // Struct to hold response data struct Memory { char *response; size_t size; }; // Callback function to handle the data received from the API static size_t ResponseCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t totalSize = size * nmemb; struct Memory *mem = (struct Memory *)userp; printf(". %zu %zu\n", size, nmemb); char *ptr = realloc(mem->response, mem->size + totalSize + 1); if (ptr == NULL) { printf("Not enough memory to allocate buffer.\n"); return 0; } mem->response = ptr; memcpy(&(mem->response[mem->size]), contents, totalSize); mem->size += totalSize; mem->response[mem->size] = '<pre class="brush:php;toolbar:false">gcc get.c -o get -lcurl'; return totalSize; } int main() { CURL *curl; CURLcode res; struct Memory chunk; chunk.response = malloc(1); // Initialize memory chunk.size = 0; // No data yet curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (curl) { // Set URL of the API endpoint char access_token[] = "your-access-token"; char slug[] = "home"; char version[]= "draft"; char url[256]; snprintf(url, sizeof(url), "https://api.storyblok.com/v2/cdn/stories/%s?version=%s&token=%s", slug, version, access_token); // Print the URL printf("URL: %s\n", url); // initializing libcurl // setting the URL curl_easy_setopt(curl, CURLOPT_URL, url ); // Follow redirect curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // Set callback function to handle response data curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ResponseCallback); // Pass the Memory struct to the callback function curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); // Perform the HTTP GET request res = curl_easy_perform(curl); // Check for errors if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { printf("Response data size: %zu\n", chunk.size); //printf("Response data: \n%s\n", chunk.response); } // Cleanup curl_easy_cleanup(curl); } // Free allocated memory free(chunk.response); curl_global_cleanup(); return 0; }
Le pointeur userp est converti en une struct Memory *. Cette structure a été transmise plus tôt dans le programme principal et est utilisée pour accumuler les données reçues.
La struct Memory est définie comme :
./get
static size_t ResponseCallback(void *contents, size_t size, size_t nmemb, void *userp)
Redimensionne le tampon de réponse pour s'adapter au nouveau bloc de données :
Si l'allocation échoue, la réallocation renvoie NULL et l'ancienne mémoire reste valide.
size_t totalSize = size * nmemb;
Si l'allocation de mémoire échoue (donc ptr est NULL), imprimez un message d'erreur et renvoyez 0. Le retour de 0 signale à libcurl d'abandonner le transfert.
struct Memory *mem = (struct Memory *)userp;
struct Memory { char *response; size_t size; };
Incrémentez la taille du tampon de réponse pour refléter la nouvelle taille totale après avoir ajouté le nouveau morceau.
sudo apt-get install libcurl4-openssl-dev
Ajoutez un terminateur nul à la fin du tampon de réponse pour en faire une chaîne C valide.
Cela garantit que la réponse peut être traitée en toute sécurité comme une chaîne normale terminée par un caractère nul.
brew install curl
Renvoie le nombre d'octets traités (totalSize).
Cela signale à libcurl que le bloc de données a été géré avec succès.
Utilisez C pour consommer des API lorsque :
Consommer des API en C peut sembler non conventionnel dans le monde de la programmation de haut niveau d'aujourd'hui, mais il s'agit d'un outil puissant pour les scénarios nécessitant des performances, un contrôle et une intégration avec les opérations au niveau du système. En utilisant des bibliothèques comme libcurl, les développeurs peuvent facilement intégrer des requêtes HTTP dans des applications C, comblant ainsi le fossé entre les API modernes et la programmation traditionnelle au niveau du système.
Grâce à ces connaissances, vous pouvez créer des applications C qui interagissent de manière transparente avec les API, prouvant que le C reste pertinent même dans les workflows de développement modernes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!