En C, comment utilisez-vous libcurl pour lire une réponse HTTP dans une chaîne?
J'ai des devoirs où j'ai besoin d'une certaine manière à comparer les deux réponses HTTP. Je suis en train d'écrire sur le C et j'ai utiliser libcurl pour rendre les choses plus facile. Je suis l'appel de la fonction qui utilise libcurl pour faire une demande et la réponse HTTP à partir d'une autre fonction, et je veux le retour de la réponse HTTP en tant que char *
. Voici mon code pour l'instant (ça plante):
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
char *handle_url(void) {
CURL *curl;
char *fp;
CURLcode res;
char *url = "http://www.yahoo.com";
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
//printf("\n%s", fp);
}
return fp;
}
Cette solution C libcurl obtenir une sortie dans une chaîne fonctionne, mais pas dans mon cas car j'ai juste envie de retourner la chaîne à la fonction appelante.
Des idées?
source d'informationauteur empty set
Vous devez vous connecter pour publier un commentaire.
Fixe pour vous. Vous avez besoin de gérer le cas où l'
write_data()
fonction est appelée plusieurs fois, et passer le bon type de paramètre. Vous avez également besoin de garder une trace de la façon dont grand une structure que vous avez, de sorte que vous pouvez allouer suffisamment de mémoire.Je l'ai laissé dans un debug
printf
dans lewrite_data
fonction pour vous aider à comprendre comment il fonctionne.Remarque: compiler avec
gcc -o test test.c -lcurl
(en supposant que vous avez collé danstest.c
). Utilisationgcc -o test test.c -lcurl -DDEBUG
de voir le test deprintf()
appels.Avertissement: c'est moche, rapide et sale de code. Il peut y avoir des bugs. Veuillez voir le plus robuste, mieux un exemple commenté ici.