首页 > 其他分享 >libcurl学习

libcurl学习

时间:2022-09-27 10:14:20浏览次数:81  
标签:setopt libcurl 学习 headers easy curl CURLOPT size

学习网站

官网

函数及其作用

  • CURL *curl_easy_init(); //初始化一个curl,如果成功返回一个CURL句柄
  • void curl_easy_cleanup(CURL *handle); //用于结束一个curl
  • CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); //设置一个curl上的选项
  • CURLcode curl_easy_perform(CURL *easy_handle); //阻塞的执行文件传输
  • CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); //从curl中获取信息

注意

  • CURLcode curl_global_init(long flags); //libcurl其他所有函数被调用之前这函数至少需要被调用一次,此函数非线程安全,只需要调用一次,最好在主线程中调用

示例代码

curl使用post上传文件
    size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) //回调函数
    {
        std::string *str = (std::string*)stream;
        (*str).append((char*)ptr, realSize);
        return size * nmemb;
    }


    std::string data;
    CURL* curl = NULL;
    CURLcode res = CURLE_OK;
    //HTTP报文头
    struct curl_slist* headers = NULL;
    struct stat filestat;
    if (stat(path.c_str(), &filestat) < 0) {
        exit(-1);
    }

    if (!(filestat.st_mode & S_IROTH)) {
        exit(-1);
    }

    if (S_ISDIR(filestat.st_mode)) {  //判断用户对该文件所拥有的权限
        exit(-1);
    }

    FILE *file = fopen(path.c_str(), "rb");  //path为文件路径
    char *content = new char[filestat.st_size];
    fread(content, 1, filestat.st_size, file);
    fclose(file);
    //初始化easy handler句柄
    curl = curl_easy_init();
    if (curl)
    {
        //构建HTTP报文头
        curl_slist *http_headers = NULL;
        std::string cookie = "Set-Cookie: " + encodePassword;
        http_headers = curl_slist_append(http_headers, cookie.c_str()); //设置请求cookie
        http_headers = curl_slist_append(http_headers, "charsets: utf-8");
        //设置method为post
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        //设置post请求的url地址
        std::string url = "http://192.168.88.128:8888" + path;
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        //设置HTTP头
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_headers);
        //设置发送超时时间
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1);

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        //将文件内容设为请求体
        curl_easy_setopt(curl,CURLOPT_POSTFIELDS,content);
        curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,filestat.st_size);  //因为是以二进制方式发送数据所以需要指定数据的长度

        //设置应答报文体内容解析回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&data);

        //执行单条请求
        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            //curl_easy_strerror进行出错打印
            std::cout << "curl_easy_perform() failed:" << curl_easy_strerror(res);

        }
        std::cout<<"main data:"<<data<<std::endl;
        curl_slist_free_all(headers);
        //这个调用用来结束一个会话.与curl_easy_init配合着用
        curl_easy_cleanup(curl);
    }
curl使用GET并将返回的数据存入文件
    size_t receive_file(void *buffer, size_t size, size_t nmemb, FILE *file) {  //回调函数
        size_t r_size = fwrite(buffer, size, nmemb, file);
        return r_size;
    }


    std::string data;
    CURL* curl = NULL;
    CURLcode res = CURLE_OK;
    //HTTP报文头
    struct curl_slist* headers = NULL;



    //初始化easy handler句柄
    curl = curl_easy_init();
    if (curl)
    {
        //构建HTTP报文头
        curl_slist *http_headers = NULL;
        std::string cookie = "Set-Cookie: " + encodePassword;
        http_headers = curl_slist_append(http_headers, cookie.c_str());
        http_headers = curl_slist_append(http_headers, "charsets: utf-8");
        //设置method为GET
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
        //设置post请求的url地址
        std::string url = "http://192.168.88.128:8888" + path;
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        //设置HTTP头
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_headers);
        //设置发送超时时间
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1);

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        
        //打开文件
        std::string route = "test.txt";
        FILE* fp;
        if ((fp = fopen(route.c_str(), "wb+")) == NULL)
        {
            printf("File.\n");

        }
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_file);//设置回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);  //将文件描述符传递给回调函数

        //执行单条请求
        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            //curl_easy_strerror进行出错打印
            std::cout << "curl_easy_perform() failed:" << curl_easy_strerror(res);
        }

        curl_slist_free_all(headers);
        //这个调用用来结束一个会话.与curl_easy_init配合着用
        curl_easy_cleanup(curl);

        fclose(fp);
    }

标签:setopt,libcurl,学习,headers,easy,curl,CURLOPT,size
From: https://www.cnblogs.com/wangzqzero/p/16722003.html

相关文章

  • 学习:网络基础知识-Https协议详解
    HTTP协议问题:发送数据都是明文的;如果第三者窃听截取数据包伪装成客户端与服务器进行交互服务器没有认证机制来确定客户端的身份客户端也没有任何机制确认服务器的身份;没......
  • MybatisPlus学习之MyBatisX插件比代码生成器还好用的哦2
    概述  https://blog.csdn.net/qq_39746820/article/details/124339612MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率但是在真正开发过程中,M......
  • C语言学习第8天
    咕了一天,今天继续更-----------------------------------------------------------判断素数实例   ----------------------------------------------------------......
  • MybatisPlus学习之MyBatisX插件比代码生成器还好用的哦
    一、MyBatisX的作用:1.xml跳转2.生成代码3.重置代码4.JAP提示跟代码生成器比较:代码生成器生成文件还有controller等文件,而mybatsx没有三、如何使用:1.安装MyBatisX:安装方......
  • 日常学习记录
    2022.9.27redis单线程与锁,构造分表的全局自增ID(所有表的id加索引,启动时候取个全局最大放到redis里,然后开始加锁自增,注意要加不可读的锁,单线程本来就是原子操作),雪花算法mo......
  • 机器学习设计模式
    机器学习设计模式介绍设计模式是一种将专家的经验和知识记录为可行建议的方法,所有从业者都可以应用这些建议来使用久经考验的方法解决他们的问题。就像我们有传统的软件......
  • 学习:网络基础知识 HTTP协议之响应报文
    响应报文-服务器回应给客户端的报文响应行+响应头部+空一行(格式代表响应头部结束)+响应体(服务器真真要返回的页面内容)   可以百度HTTP状态码可以看到详细的介绍响......
  • HCIA学习笔记三十一:静态路由的负载均衡
    一、负载分担示例• 在路由器B上配置到达路由器A的10.1.1.1网段的三条负载路由。二、负载分担实验2.1、拓扑图•分别在路由器中拖出2台AR2220、终端中拖出2台PC机,......
  • 学习:网络基础知识 HTTP协议之请求报文
    HTTP协议和安全版HTTPS协议HTTP(HyperTextTransferProtocol)超文本传输协议HTTP协议是基于TCP协议默认端口是80功能:用来规定客户端和服务端的数据传输格式特点:基......
  • Java开发学习(三十六)----SpringBoot三种配置文件解析
    一、配置文件格式我们现在启动服务器默认的端口号是8080,访问路径可以书写为http://localhost:8080/books/1在线上环境我们还是希望将端口号改为80,这样在访问的时候就......