libcurl的get、post、download的类


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


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值