zoukankan      html  css  js  c++  java
  • Sword libcurl使用

    libcurl编译
    >> ./configure --prefix=/opt/soft/curl --disable-ldap --disable-ldaps
    >> make
    >> make install
    注意点:如果使用libcurl.a静态库,那么在链接是需要增加-lrt -lcrypto -lssl -lpthread -lz这几个动态库
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    
    #include "curl/curl.h"
    
    using namespace std;
    
    //该结构体完全可以自定义,只需要在回调函数中注意使用
    struct MemoryStruct {
        char *memory;
        size_t size;
    };
    
    //请求结果后的回调函数
    static size_t callback(void *contents, size_t size, size_t nmemb, void *userp)
    {
        size_t realsize = size * nmemb;
        //内存分配可以自由控制
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;
    
        mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
        if (mem->memory == NULL) {
            /* out of memory! */
            printf("not enough memory (realloc returned NULL)
    ");
            return 0;
        }
    
        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
    
        return realsize;
    }
    
    //get方式访问
    int url_get()
    {
        //easy handler句柄
        CURL *curl_handle;
    
        //easy 错误码
        CURLcode res;
        struct MemoryStruct chunk;
    
        //HTTP报文头
        struct curl_slist* headers = NULL;
    
        /*
        这里是否分配内存,完全取决于CURLOPT_WRITEFUNCTION选项中的回调函数需要怎样分配内存,可以自由发挥
        */
        chunk.memory = (char *)malloc(1);  
        chunk.size = 0;   
    
         /*
            这个函数只能用一次,如果这个函数在curl_easy_init函数调用时还没调用,
            它讲由libcurl库自动调用,所以多线程下最好在主线程中调用一次该函数以防止在线程
            中curl_easy_init时多次调用
        */
        res = curl_global_init(CURL_GLOBAL_ALL);
        if (CURLE_OK != res)
        {
            //初始化失败
            return -1;
        }
    
        //初始化easy handler句柄
        curl_handle = curl_easy_init();
        if (NULL == curl_handle)
        {
            //easy handler句柄初始化失败
            return -1;
        }
    
        //构建HTTP报文头--可以填写多个报文头
        headers = curl_slist_append(headers,"Accept-Charset:utf-8");
        headers = curl_slist_append(headers,"Accept-Language: en-US");
        //设置HTTP报文头
        curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
    
        //请求超时时长
        curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 3L);
    
        //连接超时时长 
        curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 10L); 
    
        //允许重定向
         curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
    
         //设置为非0将响应头信息同响应体一起传给WRITEFUNCTION
         curl_easy_setopt(curl_handle, CURLOPT_HEADER, 0L);
    
          //得到请求结果后的回调函数
         curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, callback); 
    
         //获取请求结果
         //特别注意:CURLOPT_WRITEDATA必须和CURLOPT_WRITEFUNCTION一起使用,
         //因为chunk就是CURLOPT_WRITEFUNCTION的第四个参数
         curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &chunk);
    
         //设置需要访问的url地址
         //注意:必选项,不可缺少
         curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.baidu.com/?tn=98010089_dg"); 
    
         //执行请求
         res = curl_easy_perform(curl_handle);
    
         //获取HTTP返回码
         long res_code = 0;
         res = curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &res_code);
    
         if (!(res == CURLE_OK && (200 == res_code || 201 == res_code)))
         {
             //执行请求失败--也可以不判断HTTP返回码
             return -1;
         }
    
         //将下载下来的数据存在本地
         FILE *pfw = fopen("1.html", "w");
         fwrite(chunk.memory, chunk.size, 1, pfw);
         fclose(pfw);
    
         //清理HTTP报文头
         curl_slist_free_all(headers);
    
         //清理easy handler句柄
         curl_easy_cleanup(curl_handle);
    
         //清理全局变量
         curl_global_cleanup();
    
        return 0;
    }
    
    //post方式访问
    int url_post()
    {
        CURL *curl_handle;
    
        CURLcode res;
        struct MemoryStruct chunk;
    
        chunk.memory = (char *)malloc(1);
        chunk.size = 0;
    
        res = curl_global_init(CURL_GLOBAL_ALL);
        if (CURLE_OK != res)
        {
            return -1;
        }
        curl_handle = curl_easy_init();
        if (NULL == curl_handle)
        {
            return -1;
        }
    
        //post参数之间使用 & 分隔
        char *post_arg = (char *)"user_id=speech&domain=1&language=zh&speed=5&text=标贝语音,为您服务";
    
        //设置post参数
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, post_arg);
    
        // 设置为非0表示本次操作为POST
        curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
    
        //得到请求结果后的回调函数
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, callback);
    
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &chunk);
    
        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://xxx/tts");
    
        //执行请求
        res = curl_easy_perform(curl_handle);
    
        //获取HTTP返回码
        long res_code = 0;
        res = curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &res_code);
    
        if (!(res == CURLE_OK && (200 == res_code || 201 == res_code)))
        {
            //执行请求失败--也可以不判断HTTP返回码
            return -1;
        }
    
        FILE *pfw = fopen("1.mp3", "w");
        fwrite(chunk.memory, chunk.size, 1, pfw);
        fclose(pfw);
    
        curl_easy_cleanup(curl_handle);
        curl_global_cleanup();
    
        return 0;
    
    }
    
    int main()
    {
        url_post();
        return 0;
    }
    //当url中有特殊字符时,例如空格等,需要使用curl_easy_escape转码
    CURL *curl = curl_easy_init();
    if(curl) {
      char *output = curl_easy_escape(curl, "data to convert", 15);
      if(output) {
        printf("Encoded: %s
    ", output);
        curl_free(output);
      }
    }
    //注意需要调用curl_free()函数释放返回值
    liburl动态需要依赖ssl库文件libcrypto.so libssl.so
  • 相关阅读:
    Docker的使用
    单元测试框架--Mocha
    Typescript-规范
    Docker Hello World
    node项目的基本构建流程或者打开一个node项目的流程
    node.js安装及初用
    windows系统安装MongoDB
    微信小程序实现滚动视频自动播放(未优化)
    js判断一个字符串中出现次数最多的字符及次数
    vue相关知识点及面试
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/9715998.html
Copyright © 2011-2022 走看看