C libcurl obtenir une sortie dans une chaîne
Je veux stocker le résultat de ce roulage de la fonction dans une variable, comment puis-je le faire?
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
merci, je l'ai résolu comme ceci:
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
function_pt(void *ptr, size_t size, size_t nmemb, void *stream){
printf("%d", atoi(ptr));
}
int main(void)
{
CURL *curl;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_pt);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
system("pause");
return 0;
}
- Juste pour signaler à votre solution dans function_pt() de la conversion de la chaîne en ptr en entier en vue de le convertir en chaînes de caractères dans la sortie. Vous pouvez la chaîne de sortie directement (et voir la réponse complète).
- voici un lien vers le cURL exemple curl.haxx.se/libcurl/c/getinmemory.html
CURLcode res;
est pas utilisé- même question mais pour le C++ au lieu de c aller ici: Enregistrer cURL contenu résultat dans une chaîne de caractères en C++
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir une fonction de rappel pour recevoir les blocs de données à l'aide de
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, myfunc);
Le rappel de prendre un définis par l'utilisateur argument que vous pouvez définir à l'aide
curl_easy_setopt(curl, CURLOPT_WRITEDATA, p)
Voici un extrait de code qui passe un tampon
struct string {*ptr; len}
à la fonction de rappel et augmente que de la mémoire tampon sur chaque appel à l'aide de realloc().size_t
(en plus delen
lui-même) serait déclaréconst
.std::string
aller iciLa réponse suivante est le C++ façon de le faire, avec
std::string
, au lieu de null-terminated string. Il utilise toujours une fonction de rappel (il n'y a pas moyen de contourner cela), mais gère également la répartition de l'erreur à l'aide de try/catch.s->append((char*)contents. nmemb);
fonctionne parfaitement avec moi et est plus concis. Aussi, le fonction officielle de signature pour le rappel a unchar*
comme premier argument, et vous pouvez donc l'utiliser et d'omettre le casting. Et enfin,s->resize()
initialise en fait le nouvellement alloué de l'espace. Comme vous êtes sur le point de l'écraser de toute façon,s->reserve()
serait plus efficace.De lire le manuel ici: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html je pense que vous avez besoin de plusieurs appels à CURL_SETOPT, la première étant l'URL que vous souhaitez traiter, la deuxième étant quelque chose comme:
Où function_ptr correspond à cette signature:
Ce qui se passe ici est de vous désigner une fonction de rappel qui libcurl appellera quand il a une sortie à écrire à partir de ce que le transfert que vous avez appelé. Vous pouvez l'obtenir automatiquement les écrire dans un fichier, ou de passer un pointeur vers une fonction qui va gérer la sortie elle-même. En utilisant cette fonction, vous devriez être en mesure d'assembler les différentes chaînes de sortie en un seul morceau et ensuite les utiliser dans votre programme.
Je ne suis pas sûr de ce que d'autres options que vous pourriez avoir à régler /quoi d'autre affecte la façon dont vous voulez que votre application se comporter, alors jetez un bon coup d'oeil par le biais de cette page.