libcurl.lib(或libcurl.so,unix下面尽量实时编译,并且要注意系统版本(32 or 64))是跨平台解析http请求数据的动态库,使用起来非常方便。
以在Windows下使用为例。
在使用前,要将libcurl库相关的头文件添加至附加包含目录。
引用相关库:
#pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"winmm.lib") #pragma comment(lib,"wldap32.lib") #pragma comment(lib,"libcurl.lib")
在预处理器定义中添加:BUILDING_LIBCURL;HTTP_ONLY
下面就是直接使用libcurl.lib的示例了。
HttpHelper.h
#ifndef HTTPHELPER
#define HTTPHELPER
#include "curl.h"
#include "easy.h"
#include "curlbuild.h"
#include "curlrules.h"
using namespace std;
#include <vector>
//http数据类
class TileInfo
{
public:
TileInfo()
{
data=NULL;
}
~TileInfo()
{
if (data)
{
delete[] data;
data=NULL;
}
}
char* data;
long dataSize;
};
//http服务类
class HttpHelper
{
public:
static HttpHelper* GetInstance();
private:
HttpHelper(void);
~HttpHelper(void);
//释放单例模式
class CGarbo
{
public:
~CGarbo()
{
if (HttpHelper::m_pInstance)
{
//释放资源
curl_global_cleanup();
delete HttpHelper::m_pInstance;
HttpHelper::m_pInstance=NULL;
}
}
};
public:
//通过http地址获取返回的数据
bool GetDataByURL(const char* URL,char*& data,int& dataSize);
private:
bool curlInitTile(CURL *&curl,const char* url,vector<TileInfo*>& vecTileData);
bool getTileDataByCurl(const char* URL,vector<TileInfo*>& vecTileData);
private:
static HttpHelper* m_pInstance;
static std::_Mutex m_muTex; //线程锁
static CGarbo m_cGarBo;
};
#endif
HttpHelper.cpp
#include "HttpHelper.h"
HttpHelper* HttpHelper::m_pInstance=NULL;
HttpHelper::CGarbo HttpHelper::m_cGarBo;
std::_Mutex HttpHelper::m_muTex;
HttpHelper::HttpHelper(void)
{
}
HttpHelper::~HttpHelper(void)
{
}
//线程安全的单例模式
HttpHelper* HttpHelper::GetInstance()
{
if (m_pInstance==NULL)
{
m_muTex._Lock();
if (m_pInstance==NULL)
{
m_pInstance=new HttpHelper;
//初始化curl
curl_global_init(CURL_GLOBAL_ALL);
}
m_muTex._Unlock();
}
return m_pInstance;
}
bool HttpHelper::GetDataByURL(const char* URL,char*& data,int& dataSize)
{
vector<TileInfo*> vecData;
bool bSuccess=getTileDataByCurl(URL,vecData);
if (bSuccess)
{
//获取数据大小
vector<TileInfo*>::iterator pIter = vecData.begin();
for (;pIter!=vecData.end();pIter++)
{
dataSize+=((*pIter)->dataSize);
}
//数据合并
pIter = vecData.begin();
data = new char[dataSize];
long nBegin=0;
for (;pIter!=vecData.end();pIter++)
{
memcpy(data+nBegin,(*pIter)->data,(*pIter)->dataSize);
nBegin+=((*pIter)->dataSize);
}
}
//释放内存
if (vecData.size()>0)
{
vector<TileInfo*>::iterator pIter = vecData.begin();
for (;pIter!=vecData.end();pIter++)
{
delete *pIter;
(*pIter)=NULL;
}
vector<TileInfo*>().swap(vecData);
}
}
//数据回调函数
long writerTile(void* data,int size,int nmemb,vector<TileInfo*>& vecData)
{
long sizes=size*nmemb;
TileInfo* tf=new TileInfo;
tf->data=new char[sizes+1];
memcpy(tf->data,(char*)data,sizes);
tf->data[sizes]=0;
tf->dataSize=sizes;
vecData.push_back(tf);
return sizes;
}
//curl句柄初始化
bool HttpHelper::curlInitTile(CURL *&curl,const char* url,vector<TileInfo*>& vecData)
{
CURLcode code;
char* error=NULL;
curl=curl_easy_init();
if (curl==NULL)
{
return false;
}
code=curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,error);
if (code!=CURLE_OK)
{
return false;
}
curl_easy_setopt(curl,CURLOPT_VERBOSE,1L);
code=curl_easy_setopt(curl,CURLOPT_URL,url);
if (code!=CURLE_OK)
{
return false;
}
code=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,writerTile);
if (code!=CURLE_OK)
{
return false;
}
code=curl_easy_setopt(curl,CURLOPT_WRITEDATA,&vecData);
if (code!=CURLE_OK)
{
return false;
}
return true;
}
//发送http请求获取数据
bool HttpHelper::getTileDataByCurl(const char* URL,vector<TileInfo*>& vecTileData)
{
//定义一个easy handle句柄
CURL* curl=NULL;
CURLcode code;
//初始化
if (!curlInitTile(curl,URL,vecTileData))
{
curl_easy_cleanup(curl);
return false;
}
//执行数据请求
code = curl_easy_perform(curl);
if (code!=CURLE_OK)
{
curl_easy_cleanup(curl);
return false;
}
//获取数据
long retCode=0;
code=curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&retCode);
if (code==CURLE_OK && retCode==200)
{
double length=0;
code=curl_easy_getinfo(curl,CURLINFO_CONTENT_LENGTH_DOWNLOAD,&length);
}
else
{
curl_easy_cleanup(curl);
return false;
}
curl_easy_cleanup(curl);
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)