Heim > Artikel > Backend-Entwicklung > Nutzung von APIs in C: ein praktischer Leitfaden für moderne Entwickler
Heutzutage ist die Nutzung von Web-APIs eine gängige Praxis für den Datenaustausch zwischen Anwendungen. Tutorials zur Verwendung von APIs in Sprachen wie JavaScript, Python oder PHP gibt es in Hülle und Fülle, doch C – das oft mit der Programmierung auf Systemebene in Verbindung gebracht wird – wird für diesen Zweck selten in Betracht gezogen. C ist jedoch durchaus in der Lage, API-Anfragen zu verarbeiten, was es zu einer brauchbaren Wahl für Szenarien wie Point-of-Sale-Systeme (PoS), IoT-Geräte oder eingebettete Anwendungen macht, in denen C aufgrund seiner Effizienz und einfachen Steuerung bereits verwendet wird.
In diesem Artikel wird untersucht, wie man APIs in C nutzt und dabei die libcurl-Bibliothek nutzt. Am Ende werden Sie verstehen, wie Sie mit C Daten von APIs abrufen und verarbeiten und warum dieser Ansatz auch in der modernen Entwicklung relevant ist.
Während höhere Sprachen die Webentwicklung dominieren, ist C immer noch eine praktische Wahl für die Nutzung von APIs in bestimmten Anwendungsfällen:
Um APIs in C zu nutzen, ist libcurl die Bibliothek der Wahl. Es handelt sich um eine Open-Source-, portable und funktionsreiche Bibliothek zur Bearbeitung von Netzwerkanfragen über HTTP, HTTPS, FTP und mehr. Es unterstützt:
Lassen Sie uns den Prozess der Nutzung einer API mit C durchgehen und uns dabei auf ein reales Beispiel für das Abrufen von JSON-Daten konzentrieren.
Um libcurl verwenden zu können, müssen Sie es auf Ihrem System installieren. Bei den meisten Linux-Distributionen kann dies erfolgen mit:
sudo apt-get install libcurl4-openssl-dev
Unter Windows können Sie vorkompilierte Binärdateien von der libcurl-Website herunterladen: https://curl.se/download.html
Wenn Sie Homebrew unter macOS verwenden, können Sie es über
installieren
brew install curl
Ein einfaches C-Programm zum Abrufen von Daten von einer API umfasst die folgenden Komponenten:
Hier ist ein Beispielprogramm zum Abrufen von JSON-Daten von einer öffentlichen API:
sudo apt-get install libcurl4-openssl-dev
Speichern Sie den Code in einer Datei, z. B. get.c.
Kompilieren Sie es mit dem folgenden Befehl:
brew install curl
Führen Sie das kompilierte Programm aus:
#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; }
Wenn Sie mit libcurl arbeiten, um HTTP-Antworten in C zu verarbeiten, ist es wichtig, das Verhalten der Rückruffunktion zu verstehen. Die Rückruffunktion, die Sie zum Verarbeiten der Antwortdaten definieren, z. B. die ResponseCallback-Funktion, kann für eine einzelne HTTP-Antwort mehrmals aufgerufen werden. Hier erfahren Sie, warum und wie das funktioniert.
Der Rückrufmechanismus in libcurl ist darauf ausgelegt, Daten effizient und flexibel zu verarbeiten. Anstatt darauf zu warten, dass die gesamte Antwort heruntergeladen wurde, bevor sie verarbeitet wird, verarbeitet libcurl die Antwort in kleineren Blöcken und ruft Ihre Rückruffunktion auf, sobald jeder Block empfangen wird.
Dieses Verhalten ermöglicht:
Wie funktioniert es?
Jedes Mal, wenn ein Datenblock vom Server empfangen wird, ruft libcurl Ihre Rückruffunktion auf. Die Größe jedes Blocks hängt von den Netzwerkbedingungen, den Puffergrößen und der internen Logik von libcurl ab.
Der Rückruf muss die Blöcke akkumulieren und letztendlich die vollständige Antwort rekonstruieren.
Hier ist eine Beispielsequenz:
Der ResponseCallback ist die Funktion, die aufgerufen wird, wenn Daten von libcurl empfangen werden.
sudo apt-get install libcurl4-openssl-dev
brew install curl
Dadurch wird die Gesamtgröße des aktuell empfangenen Datenblocks berechnet, indem die Größe eines Blocks (Größe) mit der Anzahl der Blöcke (nmemb) multipliziert wird.
Wenn der Server beispielsweise 8 Blöcke mit jeweils 256 Byte sendet, beträgt die Gesamtgröße 8 * 256 = 2048 Byte.
#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; }
Der Userp-Zeiger wird in eine Struktur Memory * umgewandelt. Diese Struktur wurde zuvor im Hauptprogramm übergeben und wird zum Sammeln der empfangenen Daten verwendet.
Die Struktur Memory ist definiert als:
./get
static size_t ResponseCallback(void *contents, size_t size, size_t nmemb, void *userp)
Ändert die Größe des Antwortpuffers, um den neuen Datenblock aufzunehmen:
Wenn die Zuweisung fehlschlägt, gibt realloc NULL zurück und der alte Speicher bleibt gültig.
size_t totalSize = size * nmemb;
Wenn die Speicherzuweisung fehlschlägt (also ptr NULL ist), geben Sie eine Fehlermeldung aus und geben Sie 0 zurück. Die Rückgabe von 0 signalisiert libcurl, die Übertragung abzubrechen.
struct Memory *mem = (struct Memory *)userp;
struct Memory { char *response; size_t size; };
Erhöhen Sie die Größe des Antwortpuffers, um die neue Gesamtgröße nach dem Anhängen des neuen Blocks widerzuspiegeln.
sudo apt-get install libcurl4-openssl-dev
Fügen Sie am Ende des Antwortpuffers einen Nullterminator hinzu, um daraus einen gültigen C-String zu machen.
Dadurch wird sichergestellt, dass die Antwort sicher als normale nullterminierte Zeichenfolge behandelt werden kann.
brew install curl
Gibt die Anzahl der verarbeiteten Bytes zurück (totalSize).
Dies signalisiert libcurl, dass der Datenblock erfolgreich verarbeitet wurde.
Verwenden Sie C zum Konsumieren von APIs, wenn:
Die Nutzung von APIs in C mag in der heutigen High-Level-Programmierwelt unkonventionell erscheinen, aber es ist ein leistungsstarkes Tool für Szenarien, die Leistung, Kontrolle und Integration mit Vorgängen auf Systemebene erfordern. Durch die Verwendung von Bibliotheken wie libcurl können Entwickler HTTP-Anfragen problemlos in C-Anwendungen integrieren und so die Lücke zwischen modernen APIs und traditioneller Programmierung auf Systemebene schließen.
Mit diesem Wissen können Sie C-Anwendungen erstellen, die nahtlos mit APIs interagieren und so beweisen, dass C auch in modernen Entwicklungsworkflows relevant bleibt.
Das obige ist der detaillierte Inhalt vonNutzung von APIs in C: ein praktischer Leitfaden für moderne Entwickler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!