zoukankan      html  css  js  c++  java
  • [转]C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装

    原文连接: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
    ",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
    ", 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
    ", 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;
    }
  • 相关阅读:
    Echarts关于仪表盘
    Echarts CPU监控 (折线仪表盘,图例混搭)
    物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
    eCharts使用图表简单示例
    Andorid之ActivityManager
    IOS之NSFileManager 和NSFileHandle
    IOS UITableView多选删除功能
    IOS Xib使用——Xib表示局部界面
    Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航
    IOS程式语法之block的使用掌握
  • 原文地址:https://www.cnblogs.com/lyggqm/p/11450555.html
Copyright © 2011-2022 走看看