c++中使用LibCurl解析http请求数据
来源:互联网 发布:移动数据流量套餐退订 编辑:程序博客网 时间:2024/06/05 06:52
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;//初始化curlcurl_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;}
0 0
- c++中使用LibCurl解析http请求数据
- C/C++使用libcurl库发送http请求
- 使用libcurl异步发送http请求
- libcurl HTTP POST请求向服务器发送json数据
- c/c++调用libcurl库发送http请求
- libcurl使用HTTP的get请求来下载文件
- c++ 使用libcurl 发送http get/post请求
- c++ 使用libcurl 发送http get/post请求
- Centos下C++使用libcurl库调用HTTP请求实践
- C/C++使用libcurl库发送http请求(get和post可以用于请求html信息,也可以请求xml和json等串)
- 使用libcurl以Post方式向HTTP服务器提交数据
- 使用libcurl以Post方式向HTTP服务器提交数据
- c语言libcurl网络http操作编程库使用
- Angular1中数据请求$http服务的正确使用姿势
- IOS中http请求数据的解析以及http状态码的获取
- c++中使用libcurl库进行http网络编程
- http请求返回并解析json数据
- node.js解析http请求数据
- socket.io搭建分布式Web推送服务器
- 调用系统蓝牙传送文件
- Android-手把手教你自定义view
- Codeforces 4D. Mysterious Present
- linux常用头文件详解
- c++中使用LibCurl解析http请求数据
- MySQL之锁的使用
- Activity Recognition行为识别
- js中event.target
- Android优秀开源项目
- xampp结合chrome和eclipse调试php的配置步骤
- win8.1出现黑屏,但还能显示一些窗口
- oracle创建用户、创建表空间、授权、建表
- java01.基础知识