7
votes

Problème de libcurl avec les données de curl_easy_perform ()

C'est probablement une question stupide, mais comment puis-je réellement obtenir strong> les données du site renvoyées par curl_easy_perform () code> dans une variable que je peux travailler. Quand il exécute, je viens de voir tout cela flash sur le terminal. J'utilise C, au fait.

Des idées? Merci. P>

EDIT: strong> C'est le code que j'utilise (j'accède à l'API en streaming Twitter, je le fais même correctement?) P>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?track=http");
curl_easy_setopt(curl, CURLOPT_USERPWD, "JEggers2:password");
    res = curl_easy_perform(curl);

    /* always cleanup */ 
    curl_easy_cleanup(curl);


  }   
  return 0;
}


0 commentaires

3 Réponses :


7
votes

Pour obtenir les données dans la chaîne, vous devez configurer une fonction de rappel écriture: xxx pré>

En outre, l'adresse de votre variable de chaîne pour recevoir les données: p>

size_t callback_func(void *ptr, size_t size, size_t count, void *stream)
{
      /* ptr - your string variable.
      stream - data chuck you received */

     printf("%.*s", size, (char*)stream);
}


6 commentaires

Pourriez-vous me donner un exemple de la fonction de rappel s'il vous plaît? Merci


Je reçois: Main.c: 10: AVERTISSEMENT: Format Pas un argument littéral à chaîne et pas de format. Des idées?


Je suppose que vous avez besoin printf ("% s", (char *) flux);


Merci Dave, ça marche :) Si vous supprimez ce support d'ouverture supplémentaire de votre dernier exemple, je vais aller de l'avant cela comme la réponse!


NOOOOOOOOOOOOO Les données ont été transmises au rappel, ne sont pas terminées de zéro. Vous ne pouvez pas et ne doit pas faire des opérations de chaîne comme Printf% S sur cela comme ça. Voir cet exemple à la place curl.haxx.se/libcurl/c/getinmemory.htmlled/a >


Corrigé, merci Daniel! Juste pour l'exemple Sake à l'aide de Printf Je me suis emporté.



4
votes

L'autre réponse semble être incorrecte dans son utilisation de premier et dernier paramètres de callback_func code> (voir DOCS ). Le morceau réel des données que vous avez reçues est dans le premier paramètre, PTR code>, tandis que le pointeur que vous transmettez avec curlopt_writetata ​​code> est le dernier paramètre.

J'ai fait une compilable complète Exemple: P>

#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

size_t dataSize=0;
size_t curlWriteFunction(void* ptr, size_t size/*always==1*/,
                         size_t nmemb, void* userdata)
{
    char** stringToWrite=(char**)userdata;
    const char* input=(const char*)ptr;
    if(nmemb==0) return 0;
    if(!*stringToWrite)
        *stringToWrite=malloc(nmemb+1);
    else
        *stringToWrite=realloc(*stringToWrite, dataSize+nmemb+1);
    memcpy(*stringToWrite+dataSize, input, nmemb);
    dataSize+=nmemb;
    (*stringToWrite)[dataSize]='\0';
    return nmemb;
}

int main()
{
    char* data=0;
    CURL*const curl=curl_easy_init();
    if(!curl)
    {
        fprintf(stderr, "Failed to init curl");
        return 1;
    }
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlWriteFunction);
    if(curl_easy_perform(curl)!=CURLE_OK)
    {
        fprintf(stderr, "Failed to get web page\n");
        return 1;
    }
    curl_easy_cleanup(curl);

    if(!data)
    {
        fprintf(stderr, "Got no data\n");
        return 1;
    }

    printf("Page data:\n\n%s\n", data);
    free(data);
}


1 commentaires

Cela m'a beaucoup aidé, mais pour une raison quelconque quand je l'ai couru (en C ++), cette affaire n'a jamais été appelée: si (! * Stringtowrite) * stringtowrite = malloc (nmemb + 1)) . Je devais le forcer à entrer dans cette condition en utilisant si (DataSize == 0) sur le premier tour. Avant de faire cela, il se verrait pour une raison quelconque si tentative de realloc avant que le Malloc avait été appelé la première fois.



0
votes

La fonction WriditAtraStream a un pointeur vide appelé tampon ce pointeur contient toutes les données (code HTML et en-têtes) xxx

curlopt_writère

CURLOPT_WRIREDATA


0 commentaires