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请求数据 的相关文章

  • 志愿者匹配 API Objective C

    我正在使用 AFNetworking 对 VolunteerMatch API 执行 Web 请求 当我执行请求时 我收到 200 代码 但没有收到响应 典型的 VolunteerMatch 请求如下所示 GET api call acti
  • 使用 Ruby Curb 传递 GET 参数

    我正在尝试使用 Curb curb rubyforge org 调用需要在 get 请求中提供参数的 RESTful API 我想获取一个像这样的URLhttp foo com bar xml bla blablabla 我希望能够做类似的
  • 如何在 Rails 中重定向到 404?

    我想在 Rails 中 伪造 404 页面 在 PHP 中 我只发送一个带有错误代码的标头 如下所示 header HTTP 1 0 404 Not Found Rails 是如何做到这一点的 不要自己渲染 404 没有理由这样做 Rail
  • 使用哪个 HTTP 状态代码来拒绝由于乐观锁定失败而导致的 PUT

    假设我想实现某种乐观锁定并使用 ETag 来指示最新的资源状态 这意味着 客户将使用If Match标题时PUT等待更新 根据HTTP规范 http www w3 org Protocols rfc2616 rfc2616 sec14 ht
  • 通用开源 REST 客户端? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将 POST 请求内容保存为 .NET 中的文件 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个客户端应用程序POST请求a
  • Java HttpURLConnection:内容长度计算

    我目前正在为 bitbucket issues RESTful API 开发一个库 我取得了很大的进步 现在我要解决这个部分更新问题 http confluence atlassian com display BBDEV Issues Is
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • libcurl:我无法像浏览器一样快地下载网络资源

    如果您愿意 请检查这个简单的网页 http alvein freevar com http alvein freevar com这只是一个简单的画廊 里面有 1999 年的小图片 Chrome和Edge均完成满载10秒以下 缓存为空 像这样
  • 通过 http 的私有 git 存储库

    你能推荐任何简单的解决方案来设置可通过http s cleutus建议的 访问的git存储库吗 我有自己的 http 服务器 我想用它来托管一些小型私人项目 在家里我可以通过 ssh 连接 但在工作中防火墙阻止我这样做 有没有免费的方法来设
  • 如何通过 HTTP POST 发送充满对象的 NSArray?

    我在 iPhone 端有一个产品 购物清单 由具有名称 product id 等的产品对象组成 我希望将此列表发送到服务器 在那里我将服务器上的列表与 iphone 中的列表进行比较 以合并所做的更改并将合并的列表发送回 iphone 如何
  • 在 Ubuntu 12.04 上的 Apache 上配置 SVN 服务器

    我正在尝试通过 HTTP 访问现有的 Subversion 服务器 我的dav svn conf文件看起来像
  • org.apache.http 软件包在 API 级别 23 中被删除。替代方案是什么?

    在更新到最新的 android API 级别 23 Marshmallow 后 通过 build gradle 添加以下更改后 所有 org apache http 类都不起作用 android compileSdkVersion 23 b
  • 在 Flex 中以 HTTP Post 方式上传任意数据

    我们目前有一个 Java 小程序 可以生成大量数据并将其上传到我们的服务器 我们拥有的上传方法之一是使用 HTTP POST 到我们的服务器 其内容只是原始数据 没有多部分编码或任何内容 我正在考虑实现一个具有相同功能的 Flex 应用程序
  • HTTP 和 HTTPS iframe

    我正在创建一个小部件 我想允许其他人使用它 这iframe通过 HTTP 加载 但我想允许用户通过 HTTPS 登录 即通过 SSL 发送登录请求 同源策略中允许这样做吗 即 场景是用户可以将我的 JavaScript 集成到他们的网站 小
  • Perl:LWP::UserAgent 对于重定向 URL 始终返回代码 200

    我有一个简单的 url 它执行 302 临时错误 移至另一页 我尝试在 URL 返回代码 200 表示 OK 时检索它 并在返回 200 以外的其他内容时停止 My code my ua LWP UserAgent gt new env p
  • 由于浏览器设置的标头,Safari 拒绝重定向的 CORS 请求

    Summary Safari 拒绝一些涉及重定向的 CORS 请求 声称某些标头是不允许的 但该标头从来不是由脚本请求的 而是由浏览器添加的 所以我认为这应该不重要 Safari 的行为是一个错误吗 规格有问题吗 或者 事情变成这样是有原因
  • 有没有办法使用 ASP.NET 在用户离开页面时始终运行某些服务器端代码?

    我想知道当用户离开 ASP NET 中的页面时是否有任何方法可以始终运行一些服务器端代码 页面卸载事件不好 因为如果有人单击链接 则不会调用该事件 理想情况下 即使用户关闭浏览器 我也希望代码能够运行 我怀疑我所问的问题是不可能的 但问一下
  • 使用什么 API 在现有 MFC 应用程序中添加 HTTP 客户端支持?

    我最近接到一项任务 要添加与以下内容交互的能力网络地图服务 http en wikipedia org wiki Web Map Service到现有的 MFC 应用程序 我需要客户端 HTTP API 根据我的研究 领先的候选人似乎是CA
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个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 使用起