c++ curl下载和上传数据——c++(学习一)
来源:互联网 发布:女s网络调教男m步骤 编辑:程序博客网 时间:2024/06/06 03:08
首先必须感谢稀泥蟹大神的这篇文章。还有官网让我学习和使用了curl这个库。具体的curl的详解,请前往那里观看。我这里就是用c++封装了一下。还有说明一下,我这个是用在我的cocos2dx游戏里的。所以如果单独拿出来有问题的话还望指出,OK,直接上干货吧!随便提一下,使用它的时候应该开个线程。不然会一直阻塞在那里!!
//.hpp#ifndef FCFTestNetWorkManager_hpp#define FCFTestNetWorkManager_hpp#include <stdio.h>#include "curl.h"#include <string.h>using namespace std;typedef std::function<void (string & response)>SuccessFinishedCallBack;//请求成功,有数据返回class FCFTestNetWorkManager{public: //使用单例 static FCFTestNetWorkManager* getInstance(); //使用get方法 int GetHttpRequest(const string & strUrl,SuccessFinishedCallBack callback); //使用post方法 int PostHttpRequest(const string & strUrl,const string & filePath,map<string,string>params,SuccessFinishedCallBack callback);public: //设置回调 void setSuccesseCallBack(SuccessFinishedCallBack callBack); //设置m_debug void setDebug(bool debug); //返回的数据处理 static size_t write_data(void * buffer,size_t size, size_t nmenb,void * lpvoid); //debug static int onDebug(CURL * curl,curl_infotype itype,char * pData,size_t size,void * lpvoid); //进度 static int updateProgress(void* ptr,double rDlTotal,double rDlNow,double rUlTotal,double rUlNow);private: static FCFTestNetWorkManager * __instance; FCFTestNetWorkManager(); ~FCFTestNetWorkManager(); bool m_debug; SuccessFinishedCallBack SuccessCallBack;};#endif /* FCFTestNetWorkManager_hpp */
.cpp#include "FCFTestNetWorkManager.hpp"FCFTestNetWorkManager* FCFTestNetWorkManager::__instance = NULL;FCFTestNetWorkManager* FCFTestNetWorkManager::getInstance(){ if (NULL == __instance) { __instance = new FCFTestNetWorkManager(); } return __instance;}FCFTestNetWorkManager::FCFTestNetWorkManager():m_debug(false),SuccessCallBack(nullptr){}FCFTestNetWorkManager::~FCFTestNetWorkManager(){}void FCFTestNetWorkManager::setSuccesseCallBack(SuccessFinishedCallBack callBack){ SuccessCallBack = callBack;}void FCFTestNetWorkManager::setDebug(bool debug){ m_debug = debug;}int FCFTestNetWorkManager::onDebug(CURL * curl,curl_infotype itype,char * pData,size_t size,void * lpvoid){ if (itype == CURLINFO_TEXT) { printf("[text] %s\n",pData); }else if(itype == CURLINFO_HEADER_IN){ printf("[HEADER_IN] %s\n",pData); }else if(itype == CURLINFO_HEADER_OUT){ printf("[HEADER_IN] %s\n",pData); }else if(itype == CURLINFO_DATA_IN){ printf("[HEADER_IN] %s\n",pData); }else if(itype == CURLINFO_DATA_OUT){ printf("[HEADER_IN] %s\n",pData); } return (int)itype;}size_t FCFTestNetWorkManager::write_data(void * buffer,size_t size, size_t nmenb,void * lpvoid){ string * str = dynamic_cast<string *>((string*)lpvoid); if (NULL == str || NULL == buffer) { return -1; } char * pData = (char *)buffer; str->append(pData,size*nmenb); return nmenb;}int FCFTestNetWorkManager::updateProgress(void* ptr,double rDlTotal,double rDlNow,double rUlTotal,double rUlNow){ CCLOG("进度%f",rUlNow); return 0;}//get请求int FCFTestNetWorkManager::GetHttpRequest(const string & strUrl,SuccessFinishedCallBack callback){ string strResponse;//返回数据 CURL * curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT);// curl = curl_easy_init();//初始化句柄 if (NULL == curl) { return CURLE_FAILED_INIT; } if(m_debug){ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);//这个CURLOPT_VERBOSE设为1,将显示出所有发送的实体协议的细节 curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, onDebug);//这里将调用onDebug调试所有信息 } curl_easy_setopt(curl,CURLOPT_URL,strUrl.c_str());//设置url curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);//调用处理函数 curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *)&strResponse);//返回的数据,这里可以加个函数指针 curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT, 3);//设置链接时长 res = curl_easy_perform(curl);//开始下载 if (res == CURLE_OK) { callback(strResponse); } curl_global_cleanup(); curl_easy_cleanup(curl);// return res;}//post请求int FCFTestNetWorkManager::PostHttpRequest(const string & strUrl,const string & filePath,map<string,string>params,SuccessFinishedCallBack callback){ string strResponse;//返回数据 int progress; CURL * curl; CURLcode res; struct curl_httppost * post = NULL; struct curl_httppost * last = NULL; struct curl_slist * headers = NULL; static const char buf[] = "Expect:"; //配置上传文件的表单 if (!filePath.empty()) { curl_formadd(&post,&last, CURLFORM_COPYNAME,"pic", CURLFORM_FILE,filePath.c_str(), CURLFORM_CONTENTTYPE,"image/jpeg", CURLFORM_END); } //配置参数 for (auto iter = params.begin(); iter != params.end(); iter++) { curl_formadd(&post, &last, CURLFORM_COPYNAME,iter->first.c_str(), CURLFORM_COPYCONTENTS,iter->second.c_str(), CURLFORM_END); } // curl = curl_easy_init();//初始化句柄 if (NULL == curl) { return CURLE_FAILED_INIT; } if(m_debug){ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);//这个CURLOPT_VERBOSE设为1,将显示出所有发送的实体协议的细节 curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, onDebug);//这里将调用onDebug调试所有信息 } headers = curl_slist_append(headers, buf);// curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_HTTPPOST,post);//表单 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strResponse); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_data); curl_easy_setopt(curl, CURLOPT_NOPROGRESS,false);//是否需要进度 curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, updateProgress);//进度函数 curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,progress);//进度数据 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT,5);//连接时间 res = curl_easy_perform(curl); if (res == CURLE_OK) { callback(strResponse); } curl_global_cleanup(); curl_easy_cleanup(curl); curl_formfree(post); curl_slist_free_all(headers); return res;}
//使用getFCFTestNetWorkManager::getInstance()->GetHttpRequest(requestUrl, [](string & response){ log("%s",response.c_str());});//使用postFCFTestNetWorkManager::getInstance()->PostHttpRequest(requestUrl, getImgPath(), params, [](string & response){ log("%s",response.c_str());});
1 0
- c++ curl下载和上传数据——c++(学习一)
- C#FTP上传和下载
- 网上下载和上传数据(一)
- 网上下载和上传数据(一)
- 使用curl下载上传ftp (一)
- 上传和下载歌曲文件(C#)
- 文件上传和下载——文件上传(一)
- 图解使用CURL下载和上传文件
- 图片的上传和curl下载分析
- C#学习笔记之从FTP服务器上传和下载数据(一)
- Curl 上传文件和传输数据
- C语言学习_003_数据和C
- c/c++/curl实现facebook上传图片等功能
- 数据上传,下载功能(一)
- C和指针 学习笔记——第三章 数据
- rest上传图片和下载图片(c#和c++)
- 网上下载和上传数据(一) Montaque(原作)
- WebClient实现通讯(一)(上传和下载字符串数据)
- C#编程基础 实验(10) (5)
- MaterialDesign之Dialog
- instr like
- Search in Rotated Sorted Array-旋转数组的查找
- C++ std::bind思考
- c++ curl下载和上传数据——c++(学习一)
- Android签名简介
- STL
- Eclipse引用外部project android library
- Linux make
- iOS dispatch_group的使用
- 解决zlib.h:no such file or directory
- windows上安装eclipse
- JSTL标签