[转]C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装

2023-05-16

原文连接:https://www.cnblogs.com/oftenlin/p/9478067.html

CommonTools.h

  /*

 * CommonTools.h
 *
 *  Created on: 2018年8月2日
 *      Author: didi
 */
#include <iostream>
#include <curl/curl.h>
#include "zlib.h"
#include <vector>
#include <string>
#include <unistd.h>
#include <memory.h>
#include <json/json.h>
#include <sstream>
using namespace std;

class CommonTools{
    public:
        CommonTools();
        ~CommonTools();  public: static size_t receive_data(void *contents, size_t size, size_t nmemb, void *stream);  // HTTP 下载文件的回掉函数 static size_t writedata2file(void *ptr, size_t size, size_t nmemb, FILE *stream);  // 文件下载接口 static int download_file(const char* url, const char outfilename[FILENAME_MAX]);  // http get 请求 static CURLcode HttpGet(const std::string & strUrl, std::string & strResponse,int nTimeout);  // htpp post 请求 static CURLcode HttpPost(const std::string & strUrl, std::string szJson,std::string & strResponse,int nTimeout); }  

 

CommonTools.cpp

  #include "CommonTools.h"

using namespace std;


size_t CommonTools::receive_data(void *contents, size_t size, size_t nmemb, void *stream){
    string *str = (string*)stream;
    (*str).append((char*)contents, size*nmemb); return size * nmemb; } size_t CommonTools::writedata2file(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written = fwrite(ptr, size, nmemb, stream); return written; } int CommonTools::download_file(const char* url, const char outfilename[FILENAME_MAX]){ CURL *curl; FILE *fp; CURLcode res;  /* 调用curl_global_init()初始化libcurl */ res = curl_global_init(CURL_GLOBAL_ALL); if (CURLE_OK != res) { printf("init libcurl failed."); curl_global_cleanup(); return -1;  } /* 调用curl_easy_init()函数得到 easy interface型指针 */ curl = curl_easy_init();  if (curl) { fp = fopen(outfilename,"wb");  /* 调用curl_easy_setopt()设置传输选项 */ res = curl_easy_setopt(curl, CURLOPT_URL, url); if (res != CURLE_OK) { fclose(fp); curl_easy_cleanup(curl); return -1;  } /* 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务 */ res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CommonTools::writedata2file); if (res != CURLE_OK){ fclose(fp); curl_easy_cleanup(curl); return -1;  } /* 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务 */ res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); if (res != CURLE_OK) { fclose(fp); curl_easy_cleanup(curl); return -1;  } res = curl_easy_perform(curl);  // 调用curl_easy_perform()函数完成传输任务 fclose(fp);  /* Check for errors */ if(res != CURLE_OK){ fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res)); curl_easy_cleanup(curl); return -1;  } /* always cleanup */ curl_easy_cleanup(curl);  // 调用curl_easy_cleanup()释放内存 } curl_global_cleanup(); return 0; } CURLcode CommonTools::HttpGet(const std::string & strUrl, std::string & strResponse,int nTimeout){ CURLcode res; CURL* pCURL = curl_easy_init();  if (pCURL == NULL) { return CURLE_FAILED_INIT;  } curl_easy_setopt(pCURL, CURLOPT_URL, strUrl.c_str()); //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(pCURL, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(pCURL, CURLOPT_TIMEOUT, nTimeout); curl_easy_setopt(pCURL, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(pCURL, CURLOPT_WRITEFUNCTION, CommonTools::receive_data); curl_easy_setopt(pCURL, CURLOPT_WRITEDATA, (void*)&strResponse); res = curl_easy_perform(pCURL); curl_easy_cleanup(pCURL); return res; } CURLcode CommonTools::HttpPost(const std::string & strUrl, std::string szJson,std::string & strResponse,int nTimeout){ CURLcode res; char szJsonData[1024]; memset(szJsonData, 0, sizeof(szJsonData)); strcpy(szJsonData, szJson.c_str()); CURL* pCURL = curl_easy_init(); struct curl_slist* headers = NULL; if (pCURL == NULL) { return CURLE_FAILED_INIT;  } CURLcode ret; ret = curl_easy_setopt(pCURL, CURLOPT_URL, strUrl.c_str()); // std::cout << ret << std::endl;  ret = curl_easy_setopt(pCURL, CURLOPT_POST, 1L); headers = curl_slist_append(headers,"content-type:application/json");  ret = curl_easy_setopt(pCURL, CURLOPT_HTTPHEADER, headers);  ret = curl_easy_setopt(pCURL, CURLOPT_POSTFIELDS, szJsonData); //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); ret = curl_easy_setopt(pCURL, CURLOPT_TIMEOUT, nTimeout);  ret = curl_easy_setopt(pCURL, CURLOPT_WRITEFUNCTION, CommonTools::receive_data);  ret = curl_easy_setopt(pCURL, CURLOPT_WRITEDATA, (void*)&strResponse);  res = curl_easy_perform(pCURL); curl_easy_cleanup(pCURL); return res; }  

 

使用方法

Main.cpp

  // get 请求

string strURL = "http://www.baidu.com"; string strResponse; CURLcode nRes = CommonTools::HttpGet(strURL, strResponse,300); size_t nSrcLength = strResponse.length(); //下载文件 string strURL = "http://www.baidu.com/aaa.dat"; char local_file[50] = {0}; sprintf(local_file,"./pb_%d_%s.dat",1,"aaaa"); int iDownlaod_Success = CommonTools::download_file(url.c_str(),local_file); if(iDownlaod_Success<0){ char download_failure_info[100] ={0}; sprintf(download_failure_info,"download file :%s ,failure,url:",local_file,url); FATAL(download_failure_info); }  

 

 

 

C++用libcurl通过HTTP以表单的方式Post数据到服务器

一、Post 字符串


#include <stdio.h>
#include <curl/curl.h>
 
int main(void)
{
    CURL* curl = NULL;
    CURLcode res;
 
    curl = curl_easy_init();
    if(curl == NULL) 
    {
        return CURLE_FAILED_INIT;
    }
 
    struct curl_slist* headerlist = NULL; 
 
    // 设置表头,表头内容可能不同
    headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  
 
    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
 
    // 设置参数,比如"ParamName1=ParamName1Content&ParamName2=ParamName2Content&..."
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
 
    // 设置为Post
    curl_easy_setopt(curl, CURLOPT_POST, 1);
 
    // 发送
    res = curl_easy_perform(curl);
    
    if(res != CURLE_OK)
    {
        // 获取详细错误信息
        char* szErr = curl_easy_strerror(res);
        fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);
    }
 
    // 清空
    curl_easy_cleanup(curl);
 
    // 释放表头
    curl_slist_free_all (headerlist);  
    
    return 0;
}  

 

二、Post 文件


#include <stdio.h>
#include <curl/curl.h>
 
size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid);
 
int main(void)
{
    CURL* curl = NULL;
    CURLcode res;
 
    curl = curl_easy_init();
    if(curl == NULL) 
    {
        return CURLE_FAILED_INIT;
    }
 
    struct curl_slist*        headerlist    = NULL; 
    struct curl_httppost*    formpost    = NULL;
    struct curl_httppost*    lastptr        = NULL;
    std::string strResponse;    // 回复
 
    curl_formadd(&formpost, &lastptr, 
        CURLFORM_COPYNAME, "ParamName1", 
        CURLFORM_COPYCONTENTS, "ParamName1Content", CURLFORM_END);
 
    curl_formadd(&formpost, &lastptr, 
        CURLFORM_COPYNAME, "ParamName2", 
        CURLFORM_COPYCONTENTS, "ParamName2Content", CURLFORM_END);
 
    curl_formadd(&formpost, &lastptr, 
        CURLFORM_COPYNAME, "ParamName3", 
        CURLFORM_COPYCONTENTS, "ParamName3Content", CURLFORM_END);
 
    curl_formadd(&formpost, &lastptr, 
        CURLFORM_COPYNAME, "registerImgs", 
        CURLFORM_FILE, "C:/Image.png", CURLFORM_END);    // 设置要上传的文件
 
    // 设置表单参数
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
 
    // 设置表头,表头内容可能不同
    headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  
 
    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
 
    // 设置参数,比如"ParamName1=ParamName1Content&ParamName2=ParamName2Content&..."
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
 
    // 设置为Post
    curl_easy_setopt(curl, CURLOPT_POST, 1);
 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strResponse);
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
 
    // 发送
    res = curl_easy_perform(curl);
    
    if(res != CURLE_OK)
    {
        // 获取详细错误信息
        char* szErr = curl_easy_strerror(res);
        fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);
    }
 
    // 清空
    curl_easy_cleanup(curl);
 
    // 释放表单
    curl_formfree(formpost);
 
    // 释放表头
    curl_slist_free_all (headerlist);  
    
    return 0;
}
 
size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
    std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
    if( NULL == str || NULL == buffer )
    {
        return -1;
    }
 
    char* pData = (char*)buffer;
    str->append(pData, size * nmemb);
    return nmemb;
}  

转载于:https://www.cnblogs.com/lyggqm/p/11450555.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[转]C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装 的相关文章

随机推荐