C libcurl obtenir une sortie dans une chaîne

Je veux stocker le résultat de cette fonction curl dans une variable, comment puis-je le faire?

#include  #include  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  #include  #include  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; } 

    Vous pouvez définir une fonction de rappel pour recevoir les blocs de données entrants à l’aide de curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, myfunc);

    Le rappel prendra un argument défini par l’utilisateur que vous pouvez définir en utilisant curl_easy_setopt(curl, CURLOPT_WRITEDATA, p)

    Voici un extrait de code qui passe une struct ssortingng {*ptr; len} tampon struct ssortingng {*ptr; len} struct ssortingng {*ptr; len} à la fonction de rappel et augmente ce tampon à chaque appel en utilisant realloc ().

     #include  #include  #include  #include  struct ssortingng { char *ptr; size_t len; }; void init_ssortingng(struct ssortingng *s) { s->len = 0; s->ptr = malloc(s->len+1); if (s->ptr == NULL) { fprintf(stderr, "malloc() failed\n"); exit(EXIT_FAILURE); } s->ptr[0] = '\0'; } size_t writefunc(void *ptr, size_t size, size_t nmemb, struct ssortingng *s) { size_t new_len = s->len + size*nmemb; s->ptr = realloc(s->ptr, new_len+1); if (s->ptr == NULL) { fprintf(stderr, "realloc() failed\n"); exit(EXIT_FAILURE); } memcpy(s->ptr+s->len, ptr, size*nmemb); s->ptr[new_len] = '\0'; s->len = new_len; return size*nmemb; } int main(void) { CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { struct ssortingng s; init_ssortingng(&s); curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); res = curl_easy_perform(curl); printf("%s\n", s.ptr); free(s.ptr); /* always cleanup */ curl_easy_cleanup(curl); } return 0; } 

    La réponse suivante est le moyen C ++ de le faire, avec std::ssortingng , au lieu de la chaîne terminée par un caractère nul. Il utilise toujours une fonction de rappel (il n’y a pas moyen de contourner cela), mais gère également les erreurs d’allocation à l’aide de try / catch.

     #include  #include  #include  size_t CurlWrite_CallbackFunc_StdSsortingng(void *contents, size_t size, size_t nmemb, std::ssortingng *s) { size_t newLength = size*nmemb; size_t oldLength = s->size(); try { s->resize(oldLength + newLength); } catch(std::bad_alloc &e) { //handle memory problem return 0; } std::copy((char*)contents,(char*)contents+newLength,s->begin()+oldLength); return size*nmemb; } int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); std::ssortingng s; if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //only for https curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); //only for https curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdSsortingng); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L); //remove this to disable verbose output /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } /* always cleanup */ curl_easy_cleanup(curl); } std::cout<  

    En lisant le manuel ici: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html Je pense que vous avez besoin de plusieurs appels à CURL_SETOPT, le premier étant l’URL que vous voulez traiter, le second étant quelque chose comme:

     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_ptr); 

    Où function_ptr correspond à cette signature:

     size_t function( void *ptr, size_t size, size_t nmemb, void *stream) 

    Qu’est-ce qui se passe ici, vous dénotez une fonction de rappel que libcurl appellera quand il a une sortie à écrire de n’importe quel transfert que vous avez appelé. Vous pouvez l’obtenir pour écrire automatiquement dans un fichier, ou lui passer un pointeur vers une fonction qui gérera le résultat lui-même. En utilisant cette fonction, vous devriez pouvoir assembler les différentes chaînes de sortie en une seule pièce et les utiliser ensuite dans votre programme.

    Je ne suis pas sûr de savoir quelles autres options vous pouvez avoir à définir / ce qui affecte la façon dont vous voulez que votre application se comporte, alors regardez bien à travers cette page.