c++;班 我在这里阅读了一些关于ScCopExcel的C++和CURL文章,并汇编了以下内容。 主要目标是在一个类的实例中处理整个请求——也许稍后在一个辅助线程中处理

c++;班 我在这里阅读了一些关于ScCopExcel的C++和CURL文章,并汇编了以下内容。 主要目标是在一个类的实例中处理整个请求——也许稍后在一个辅助线程中处理,c++,curl,C++,Curl,我的问题是:“内容”看起来是空的,尽管它是相同的地址和地址 HttpFetch.h: class HttpFetch { private: CURL *curl; static size_t handle(char * data, size_t size, size_t nmemb, void * p); size_t handle_impl(char * data, size_t size, size_t nmemb); public: std::string

我的问题是:“内容”看起来是空的,尽管它是相同的地址和地址

HttpFetch.h:

class HttpFetch
{
private:
    CURL *curl;
    static size_t handle(char * data, size_t size, size_t nmemb, void * p);
    size_t handle_impl(char * data, size_t size, size_t nmemb);
public:
    std::string content_;
    static std::string url_;
    HttpFetch(std::string url);
    void start();
    std::string data();
};
HttpFetch.cpp:

HttpFetch::HttpFetch(std::string url) {

    curl_global_init(CURL_GLOBAL_ALL); //pretty obvious
    curl = curl_easy_init();

    content_.append("Test");
    std::cout << &content_ << "\n";

    curl_easy_setopt(curl, CURLOPT_URL, &url);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content_);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &HttpFetch::handle);
    //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); //tell curl to output its progress
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

    //std::cout << &content_ << "\n";
}

void HttpFetch::start() {

    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
}

size_t HttpFetch::handle(char * data, size_t size, size_t nmemb, void * p)
{
    std::string *stuff = reinterpret_cast<std::string*>(p);

    stuff->append(data, size * nmemb);

    std::cout << stuff << "\n"; // has content from data in it!

    return size * nmemb; 
}
HttpFetch::HttpFetch(std::string url){
curl_global_init(curl_global_ALL);//非常明显
curl=curl_easy_init();
内容附加(“测试”);

std::cout您的代码有几个问题。主要问题是行

HttpFetch call = *new HttpFetch("http://www.example.com");
curl_easy_setopt(curl, CURLOPT_URL, &url);
您创建了一个新的HttpFetch实例并将其复制到另一个实例。因此您有两个实例和两个内容字符串。若要删除此问题,请将其更改为:

HttpFetch call("http://www.example.com");
另一个错误是线路错误

HttpFetch call = *new HttpFetch("http://www.example.com");
curl_easy_setopt(curl, CURLOPT_URL, &url);
应该是哪一个

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
如果您考虑过HttpFetch之类的类中的资源管理,就可以避免此类问题您必须考虑如何初始化和清理此资源以及如何处理复制、分配或移动。如果使用C++11,最简单的解决方案是使用
std::unique_ptr
,它可以为您处理所有这些内容

class HttpFetch
{
public:
    HttpFetch(const std::string& url);
    void start();
    void Print(std::ostream& stream);
private:
    typedef void (*cleanup)(CURL*);
    typedef std::unique_ptr<CURL, cleanup> CurlHandle;

    CurlHandle curlHandle;
    std::string content_;

    static size_t handle(char * data, size_t size, size_t nmemb, void * p);
};


HttpFetch::HttpFetch(const std::string& url) 
    : curlHandle(curl_easy_init(), &curl_easy_cleanup)
{
    curl_easy_setopt(curlHandle.get(), CURLOPT_URL, url.c_str());
    curl_easy_setopt(curlHandle.get(), CURLOPT_WRITEDATA, &content_);
    curl_easy_setopt(curlHandle.get(), CURLOPT_WRITEFUNCTION, &HttpFetch::handle);
    curl_easy_setopt(curlHandle.get(), CURLOPT_FOLLOWLOCATION, 1L);
}

size_t HttpFetch::handle(char * data, size_t size, size_t nmemb, void * p){
    std::string *stuff = static_cast<std::string*>(p);
    stuff->append(data, size * nmemb);
    return size * nmemb; 
}

void HttpFetch::start() {
    content_.clear();
    curl_easy_perform(curlHandle.get());
}

void HttpFetch::Print(std::ostream& stream){
    stream << content_;
}

int main()
{
    //HttpFetch call = *new HttpFetch("...");  // this is a copiler error now
    HttpFetch call("http://www.google.com");
    call.start();

    call.Print(std::cout);
}
类HttpFetch
{
公众:
HttpFetch(const std::string和url);
void start();
作废打印(标准::ostream&stream);
私人:
typedef void(*清除)(CURL*);
typedef std::唯一的\u ptr卷曲手柄;
卷发柄卷发柄;
std::字符串内容;
静态大小句柄(char*data、size\t size、size\t nmemb、void*p);
};
HttpFetch::HttpFetch(const std::string和url)
:curlHandle(curl\u easy\u init(),&curl\u easy\u cleanup)
{
curl_easy_setopt(curlHandle.get(),CURLOPT_URL,URL.c_str());
curl\u easy\u setopt(curlHandle.get()、CURLOPT\u WRITEDATA和content);
curl\u easy\u setopt(curlHandle.get()、CURLOPT\u WRITEFUNCTION和HttpFetch::handle);
curl_easy_setopt(curlHandle.get(),CURLOPT_FOLLOWLOCATION,1L);
}
大小HttpFetch::handle(char*data,大小,大小nmemb,void*p){
std::string*stuff=static_cast(p);
填充->追加(数据,大小*nmemb);
返回大小*nmemb;
}
void HttpFetch::start(){
内容清除();
curl_easy_perform(curlHandle.get());
}
void HttpFetch::Print(std::ostream&stream){

stream您的代码有几个问题。主要问题是行

HttpFetch call = *new HttpFetch("http://www.example.com");
curl_easy_setopt(curl, CURLOPT_URL, &url);
您创建了一个新的HttpFetch实例并将其复制到另一个实例。因此您有两个实例和两个内容字符串。若要删除此问题,请将其更改为:

HttpFetch call("http://www.example.com");
另一个错误是线路错误

HttpFetch call = *new HttpFetch("http://www.example.com");
curl_easy_setopt(curl, CURLOPT_URL, &url);
应该是哪一个

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
如果您考虑过HttpFetch之类的类中的资源管理,就可以避免此类问题您必须考虑如何初始化和清理此资源以及如何处理复制、分配或移动。如果使用C++11,最简单的解决方案是使用
std::unique_ptr
,它可以为您处理所有这些内容

class HttpFetch
{
public:
    HttpFetch(const std::string& url);
    void start();
    void Print(std::ostream& stream);
private:
    typedef void (*cleanup)(CURL*);
    typedef std::unique_ptr<CURL, cleanup> CurlHandle;

    CurlHandle curlHandle;
    std::string content_;

    static size_t handle(char * data, size_t size, size_t nmemb, void * p);
};


HttpFetch::HttpFetch(const std::string& url) 
    : curlHandle(curl_easy_init(), &curl_easy_cleanup)
{
    curl_easy_setopt(curlHandle.get(), CURLOPT_URL, url.c_str());
    curl_easy_setopt(curlHandle.get(), CURLOPT_WRITEDATA, &content_);
    curl_easy_setopt(curlHandle.get(), CURLOPT_WRITEFUNCTION, &HttpFetch::handle);
    curl_easy_setopt(curlHandle.get(), CURLOPT_FOLLOWLOCATION, 1L);
}

size_t HttpFetch::handle(char * data, size_t size, size_t nmemb, void * p){
    std::string *stuff = static_cast<std::string*>(p);
    stuff->append(data, size * nmemb);
    return size * nmemb; 
}

void HttpFetch::start() {
    content_.clear();
    curl_easy_perform(curlHandle.get());
}

void HttpFetch::Print(std::ostream& stream){
    stream << content_;
}

int main()
{
    //HttpFetch call = *new HttpFetch("...");  // this is a copiler error now
    HttpFetch call("http://www.google.com");
    call.start();

    call.Print(std::cout);
}
类HttpFetch
{
公众:
HttpFetch(const std::string和url);
void start();
作废打印(标准::ostream&stream);
私人:
typedef void(*清除)(CURL*);
typedef std::唯一的\u ptr卷曲手柄;
卷发柄卷发柄;
std::字符串内容;
静态大小句柄(char*data、size\t size、size\t nmemb、void*p);
};
HttpFetch::HttpFetch(const std::string和url)
:curlHandle(curl\u easy\u init(),&curl\u easy\u cleanup)
{
curl_easy_setopt(curlHandle.get(),CURLOPT_URL,URL.c_str());
curl\u easy\u setopt(curlHandle.get()、CURLOPT\u WRITEDATA和content);
curl\u easy\u setopt(curlHandle.get()、CURLOPT\u WRITEFUNCTION和HttpFetch::handle);
curl_easy_setopt(curlHandle.get(),CURLOPT_FOLLOWLOCATION,1L);
}
大小HttpFetch::handle(char*data,大小,大小nmemb,void*p){
std::string*stuff=static_cast(p);
填充->追加(数据,大小*nmemb);
返回大小*nmemb;
}
void HttpFetch::start(){
内容清除();
curl_easy_perform(curlHandle.get());
}
void HttpFetch::Print(std::ostream&stream){
流动