Проблема libcurl с получением данных из curl_easy_perform () - PullRequest
6 голосов
/ 20 января 2011

Вероятно, это глупый вопрос, но как мне на самом деле получить данные сайта, возвращаемые curl_easy_perform(), в переменную, с которой я могу работать.Когда он запускается, я просто вижу, как все это проходит через Терминал.Я использую C, кстати.

Есть идеи?Благодарю.

РЕДАКТИРОВАТЬ: Это код, который я использую (я обращаюсь к API потоковой передачи Twitter, я даже правильно делаю?)

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

Ответы [ 2 ]

5 голосов
/ 20 января 2011

Чтобы получить данные в строку, вам нужно настроить функцию обратного вызова записи:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_func);

Также адрес вашей строковой переменной для получения данных:

curl_easy_setopt(curl, CURLOPT_WRITEDATA, &str)

Функция обратного вызова будет выглядеть так:

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);
}

Поскольку вы не будете знать общий размер данных, которые вы будете получать, вам потребуется перераспределить указатель, чтобы получить их в строку.

0 голосов
/ 21 августа 2018

Другой ответ представляется неправильным при использовании первого и последнего параметров callback_func (см. документы ). Фактический кусок данных, которые вы получили, находится в первом параметре ptr, а указатель, который вы передаете с CURLOPT_WRITEDATA - последний параметр.

Я сделал полный скомпилированный пример:

#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);
}
...