c++中使用LibCurl解析http请求数据

2023-05-16

     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(使用前将#替换为@)

c++中使用LibCurl解析http请求数据 的相关文章

随机推荐

  • 用MicroPython开发ESP32- 用Thonny写程序

    陈拓 2022 06 11 2022 06 12 1 简介 在 用MicroPython开发ESP32 固件烧写与测试 https zhuanlan zhihu com p 527291091 https blog csdn net che
  • 单片机 stm32 接收数据和处理

    背景 1 单片机串口接收数据处理 xff0c 这个代码已经过很多项目验证 xff0c 没有问题 用这个代码帮了好几个同事解决数据接收久了就异常 2 这个代码做到接收和处理分开 避免不必要的处理逻辑问题 3 也可用于网口tcp xff0c u
  • odroid Xu4介绍

    Odroid xu4介绍 下面对这块开发板做一下简单的介绍 xff0c 共需要用到的人参考 从参数上来看 xff0c ODROID XU4的整体性能基本和目前的中端智能手机差不多 xff0c 它搭载了主频
  • OdroidXu4开发环境搭建

    OdroidXu4开发环境搭建 一 烧录镜像 1 SD卡烧录 首先准备一张至少16G的sd卡 镜像可以在官网 xff1a http odroid com dokuwiki doku php id 61 en odroid xu4 softw
  • 大小端:字节序与比特序

    https blog csdn net fzy0201 article details 26876711 https blog csdn net qq 40334837 article details 89042607 前言 前两天被问到一
  • VLC Buffering机制介绍

    一 简介 了解一定播放器知识的同学应该都知道 xff0c 播放器内部是有缓存的 xff08 非直播场景 xff09 缓存的作用主要是解决生产者和消费者速度的不匹配 xff0c 给用户更好的使用体验 例如 xff0c 在网络不稳定的情况下 x
  • Linux静态库和动态库学习总结

    一 废话 之前由于工作需要 xff0c 要封装一个Linux加密解密转换的动态库 xff0c 这个之前只做过Windows下面的 xff0c Linux下面还真没有做过 xff0c 之后做了整一个晚上才算做好 xff0c 不过其中也学到了不
  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • 《C语言内核深度解析》笔记(3):指针才是C语言的精髓

    第03章 指针才是C语言的精髓 3 2 指针 int a 61 10 int p 61 amp a 指针变量p和普通变量之间没有本质区别 xff0c 都是变量空间放了一个数值 xff0c 只是p里面的数值比较特殊 xff0c 是a空间的地址
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • D1 R32 – ESP32+Arduino CNC Shield控制步进电机

    陈拓 2023 04 01 2023 04 05 1 简介 在 Arduino Uno开发板 43 电机驱动扩展版CNC Shield V3 0硬件说明 https blog csdn net chentuo2000 article det
  • pixhawk当中关于NMEA类型的gps数据处理流程

    1 启动跟新gps的数据的任务是在ArduCopter cpp中scheduler tasks中 调用的速度是50hz 2 通过执行update GPS方法中的 3 调转到ap gps cpp中的update方法中 4 在update中通过
  • C++Eigen库的配置和基本使用

    1 配置 1 下载 http bitbucket org eigen eigen get 3 2 5 tar bz2 2 配置 文件夹名字较长 xff0c 解压后可重命名 xff0c 如我命名为eigen3 xff0c 把D program
  • C++:extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 堆栈的作用,以及存放的数据

    在计算机领域 xff0c 堆栈是一个不容忽视的概念 xff0c 但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 要点 x
  • STM32 姿态传感器mpu6050的使用

    文章目录 特性引脚说明使用I2C软件 xff0c 驱动mpu6050手册中寄存器描述MPU6050初始化的步骤 xff1a 数据读取mpu6050输出的值 特性 MPU6050 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运
  • STM32 GPS定位

    文章目录 ATGM332D简介特性引脚接入串口通信NMEA 协议解析串口输出nmealib在linux下使用 ATGM332D简介 高性能 低功耗 GPS 北斗双模定位模块 特性 特性说明基本功能三维位置定位 经纬度 海拔 xff0c 测速
  • 树莓派笔记13:舵机云台(一)

    最近买了个小型舵机云台模块来玩 xff0c 淘宝上卖这个的挺多的 xff0c 一般三四十块钱 xff0c 很多还卖配套的摄像头 说是云台 xff0c 其实就是用两个舵机结合固定板做的支撑模块 xff0c 两个舵机分别控制左右和上下的转动 1
  • STM32F103ZET6串口使用USAR_TFLAG_IDLE空闲中断实现UART_DMA接收和发送不定长数据

    本文是实现STM32F103ZET6串口通过使用STM32的IDLE空闲中断 xff08 USAR TFLAG IDLE 实现UART DMA接收和发送 xff08 Rx和Tx均通过DMA通道 xff09 不定长数据 本文实现了UART1
  • c++中使用LibCurl解析http请求数据

    libcurl lib xff08 或libcurl so xff0c unix下面尽量实时编译 xff0c 并且要注意系统版本 xff08 32 or 64 xff09 xff09 是跨平台解析http请求数据的动态库 xff0c 使用起