我想为一个小项目实现一些curl和curlcpp函数。
到目前为止,我已经实现了一些功能,但现在我想添加功能。这个想法是将发送和接收的数据存储在缓冲区中,以便以后可以访问:
<<ul>我知道有CURLOPT_WRITEFUNCTION,但这只适用于响应数据,我也需要输出数据/标头。CURLOPT_DEBUGFUNCTION看起来对我有用,但我不能在CPP上配置它。
下面是我的类的示例代码:
class CurlCPPClient
{
private:
...
int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
curl::curl_easy curl_easy;
std::string raw_data;
public:
...
}
CurlCPPClient::CurlCPPClient()
{
curl_easy.add<CURLOPT_DEBUGFUNCTION>(this->trace_data);
}
int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr)
{
std::string frame_info(data);
switch(type)
{
case CURLINFO_HEADER_OUT:
case CURLINFO_DATA_OUT:
raw_data += frame_info;
break;
case CURLINFO_HEADER_IN:
case CURLINFO_DATA_IN:
raw_data += frame_info;
break;
default:
break;
}
return 0;
}
在将函数指针设置为trace_data时,我有编译器问题。我得到"错误c3867";"错误C2228"使用:this->trace_data, this。trace_data trace_data。如果我不使用trace_data作为我的类的方法,我可以调用它,但我不能保存成员的信息,以便以后在类的另一部分访问它。
libcurl的回调函数需要独立的c风格函数。不能使用非静态类方法用于回调。
声明你的trace_data()
方法为static。您可以使用CURLOPT_DEBUGDATA
将CurlCPPClient
对象的this
指针传递给方法的userptr
参数。
class CurlCPPClient
{
private:
...
static int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
curl::curl_easy curl_easy;
std::string raw_data;
public:
...
}
CurlCPPClient::CurlCPPClient()
{
curl_easy.add<CURLOPT_DEBUGFUNCTION>(&CurlCPPClient::trace_data);
curl_easy.add<CURLOPT_DEBUGDATA>(this);
}
int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr)
{
CurlCPPClient *pThis = static_cast<CurlCPPClient*>(userptr);
std::string frame_info(data, size);
switch(type)
{
case CURLINFO_HEADER_OUT:
case CURLINFO_DATA_OUT:
pThis->raw_data += frame_info;
break;
case CURLINFO_HEADER_IN:
case CURLINFO_DATA_IN:
pThis->raw_data += frame_info;
break;
default:
break;
}
return 0;
}
或者,使用CURLOPT_DEBUGDATA
将raw_data
成员传递给回调:
class CurlCPPClient
{
private:
...
static int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
curl::curl_easy curl_easy;
std::string raw_data;
public:
...
}
CurlCPPClient::CurlCPPClient()
{
curl_easy.add<CURLOPT_DEBUGFUNCTION>(&CurlCPPClient::trace_data);
curl_easy.add<CURLOPT_DEBUGDATA>(&raw_data);
}
int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr)
{
std::string *pRawData = static_cast<std::string*>(userptr);
std::string frame_info(data, size);
switch(type)
{
case CURLINFO_HEADER_OUT:
case CURLINFO_DATA_OUT:
*pRawData += frame_info;
break;
case CURLINFO_HEADER_IN:
case CURLINFO_DATA_IN:
*pRawData += frame_info;
break;
default:
break;
}
return 0;
}