libcurl使用说明下载地址:
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA
下面是一个简单的Demo,主要功能是Get/Post/DownLoad,思路自己慢慢体会,主要是参数的设置:
#pragma once
#include <string>
#include <vector>
using namespace std;
#include "curl/curl.h"
#if defined(DEBUG)||defined(_DEBUG)
#pragma comment(lib, "libcurld.lib")
#else
#pragma comment(lib, "libcurl.lib")
#endif
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "wldap32.lib")
enum HttpRequestType{ POST, GET,DOWNLOAD};
class CHttpRequestParameter
{
public:
CHttpRequestParameter()
:m_bReadWrite(FALSE)
,m_bHasCookies(TRUE)
{
}
virtual ~CHttpRequestParameter()
{
}
public:
BOOL m_bReadWrite;
BOOL m_bHasCookies;
string m_strUrl;
string m_PostData;
string m_RequestRetContext;
HttpRequestType m_CommandType;
};
typedef vector<CHttpRequestParameter> HttpParameterVector;
class CCULHttp
{
public:
CCULHttp(void);
~CCULHttp(void);
int Request(CHttpRequestParameter &HttpParameter);
int Request(HttpParameterVector &HttpParameterVec);
int DownloadFile(const string &Url, const string &SavePath);
private:
int DownLoad(CURL *curl,CHttpRequestParameter &HttpParameter);
int Post(CURL *curl,CHttpRequestParameter &HttpParameter);
int Get(CURL *curl,CHttpRequestParameter &HttpParameter);
private:
BOOL m_HasCookie;
};
#include "CULHttp.h"
#define COOKIE_FILE "cookies.txt"
CCULHttp::CCULHttp(void)
:m_HasCookie(FALSE)
{
}
CCULHttp::~CCULHttp(void)
{
}
class CHttpFileParameter
{
public:
string filename;
FILE *stream;
CHttpFileParameter()
{
stream = NULL;
}
};
size_t OnWriteFileCallback( void *buffer, size_t size, size_t nmemb, void *lpVoid )
{
CHttpFileParameter *out = (struct CHttpFileParameter *)lpVoid;
if (out && !out->stream)
{
out->stream = fopen(out->filename.c_str(), "wb");
if (!out->stream)
return -1;
}
return fwrite(buffer, size, nmemb, out->stream);
}
static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
if( NULL == str || NULL == buffer )
{
return -1;
}
char* pData = (char*)buffer;
str->append(pData, size * nmemb);
return nmemb;
}
int CCULHttp::Request(HttpParameterVector &HttpParameterVec )
{
int nRet;
CURL *curl;
CURLcode ret;
ret = curl_global_init(CURL_GLOBAL_WIN32);
curl = curl_easy_init();
if (!curl) {
return 0;
}
HttpParameterVector::iterator Iter = HttpParameterVec.begin();
while (Iter != HttpParameterVec.end())
{
if ((*Iter).m_CommandType == POST)
{
nRet = Post(curl,(*Iter));
if (nRet != 1)
break;
}
else if ((*Iter).m_CommandType == DOWNLOAD)
{
nRet = DownLoad(curl, (*Iter));
if (nRet != 1)
break;
}
else
{
nRet = Get(curl,(*Iter));
if (nRet != 1)
break;
}
Iter++;
}
curl_easy_cleanup( curl );
curl_global_cleanup();
if(nRet != 0)
return 1;
return 0;
}
int CCULHttp::Request( CHttpRequestParameter &HttpParameter )
{
int nRet = 0;
CURL *curl;
CURLcode ret;
ret = curl_global_init(CURL_GLOBAL_WIN32);
curl = curl_easy_init();
if (!curl) {
return 0;
}
if (HttpParameter.m_CommandType == POST)
{
nRet = Post(curl,HttpParameter);
}
else
{
nRet = Get(curl,HttpParameter);
}
curl_easy_cleanup( curl );
curl_global_cleanup();
if(nRet != 0)
return 1;
return 0;
}
int CCULHttp::Post( CURL *curl,CHttpRequestParameter &HttpParameter )
{
CURLcode ret;
curl_easy_setopt( curl, CURLOPT_URL, HttpParameter.m_strUrl.c_str() );
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
if (HttpParameter.m_bHasCookies)
{
if(!HttpParameter.m_bReadWrite)
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
else
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, COOKIE_FILE);
}
string strContent;
if(!HttpParameter.m_PostData.empty())
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, HttpParameter.m_PostData.c_str());
curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, OnWriteData );
curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&HttpParameter.m_RequestRetContext);
ret = curl_easy_perform( curl );
if (ret == CURLE_OK)
return 1;
return 0;
}
int CCULHttp::Get( CURL *curl,CHttpRequestParameter &HttpParameter )
{
CURLcode ret;
if (!curl)
return 0;
curl_easy_setopt( curl, CURLOPT_URL, HttpParameter.m_strUrl.c_str() );
curl_easy_setopt( curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
if (HttpParameter.m_bHasCookies)
{
if(!HttpParameter.m_bReadWrite)
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
else
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, COOKIE_FILE);
}
curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, OnWriteData );
curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&HttpParameter.m_RequestRetContext );
ret = curl_easy_perform( curl );
if (ret == CURLE_OK)
return 1;
return 0;
}
int CCULHttp::DownloadFile( const string &Url, const string &SavePath )
{
CURL *curl;
CURLcode ret;
ret = curl_global_init(CURL_GLOBAL_WIN32);
curl = curl_easy_init();
if (!curl) {
return 0;
}
curl_easy_setopt( curl, CURLOPT_URL, Url.c_str() );
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, COOKIE_FILE);
curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, OnWriteFileCallback );
CHttpFileParameter httpFile;
httpFile.filename = SavePath;
curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&httpFile );
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "BOX_No=00&DocID=2415927306&PageNo=2&Mode=THUMB&EFLG=true&Dummy=1446455148637");
ret = curl_easy_perform( curl );
if (httpFile.stream != NULL)
{
fclose(httpFile.stream);
}
curl_easy_cleanup( curl );
curl_global_cleanup();
return ret;
}
int CCULHttp::DownLoad( CURL *curl,CHttpRequestParameter &HttpParameter )
{
curl_easy_setopt(curl, CURLOPT_URL, HttpParameter.m_strUrl.c_str() );
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); 设置301、302跳转跟随location
curl_easy_setopt(curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, COOKIE_FILE);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteFileCallback );
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(curl, CURLOPT_POST, false);
CHttpFileParameter httpFile;
httpFile.filename = HttpParameter.m_RequestRetContext;
curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&httpFile );
if(!HttpParameter.m_PostData.empty())
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, HttpParameter.m_PostData.c_str());
CURLcode res = curl_easy_perform( curl );
if (httpFile.stream != NULL)
{
fclose(httpFile.stream);
}
return 1;
}
使用:
int main( void )
{
//第一次请求需要通过Get把Cookie缓存下来,Cookie有效期可能30天
//Cookie缓存后在有效时期不需要再请求Cookie缓存
HttpParameterVector ParameterVector;
CHttpRequestParameter LoginParameter;
LoginParameter.m_bReadWrite = TRUE;
LoginParameter.m_strUrl = "http://192.168.0.12:8000";
LoginParameter.m_PostData = "uri=%2F&user_type_generic=true&deptid=&password=";
LoginParameter.m_CommandType = POST;
ParameterVector.push_back(LoginParameter);
CHttpRequestParameter UrlParameter;
UrlParameter.m_bReadWrite = TRUE;
UrlParameter.m_strUrl = "http://192.168.0.12:8000/rps/nativetop.cgi?";
UrlParameter.m_CommandType = POST;
UrlParameter.m_PostData = "RUIPNxBundle=&CorePGTAG=PGTAG_BOX_USER&Dummy=1446455855426";
ParameterVector.push_back(UrlParameter);
CHttpRequestParameter fileParameter;
fileParameter.m_bReadWrite = TRUE;
fileParameter.m_strUrl = "http://192.168.0.12:8000/rps/blogin.cgi";
fileParameter.m_CommandType = POST;
fileParameter.m_PostData = "BOX_No=01&BoxKind=UserBox&Dummy=1446455148637&Cookie=";
ParameterVector.push_back(fileParameter);
//http://192.168.0.12:8000/rps/image.jpg?BOX_No=01&DocID=3221225558&PageNo=1&Mode=THUMB&EFLG=true&Dummy=1448873440016
CHttpRequestParameter DownloadFile1;
DownloadFile1.m_bReadWrite = TRUE;
DownloadFile1.m_CommandType = DOWNLOAD;
DownloadFile1.m_strUrl = "http://192.168.0.12:8000/rps/image.jpg?BOX_No=01&DocID=3221225558&PageNo=1&Mode=THUMB&EFLG=true&Dummy=1448873440016";
DownloadFile1.m_PostData = "BOX_No=01&DocID=3221225558&PageNo=1&Mode=THUMB&EFLG=true&Dummy=1448873440016";
DownloadFile1.m_RequestRetContext = "D:\\1.jpg";
ParameterVector.push_back(DownloadFile1);
CCULHttp http;
http.Request(ParameterVector);
return 0;
}