• 使用libcurl请求https的get/post


    最近有个需求,需要用c++请求下我自己的服务器,周末看了一下怎么发起http请求
    官方文档见:

    https://curl.se/libcurl/c/example.html

    官网的demo是基于c的,我用的时候报错了。下面是我写的get/post的方法,同步执行。

    namespace yeshen_http
    {
      struct MemoryStruct
      {
        char *memory;
        size_t size;
      };
    
      static size_t
      WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
      {
        size_t realsize = size * nmemb;
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;
    
        void *ptr = realloc(mem->memory, mem->size + realsize + 1);
        if (!ptr)
        {
          std::cout << "not enough memory (realloc returned NULL)" << std::endl;
          return 0;
        }
        mem->memory = (char *)ptr;
        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
        return realsize;
      }
    
      static const char *get_url = "https://yeshen.org";
    }
    
    int HTTP::get(const char *url, std::string &response)
    {
      CURL *curl = curl_easy_init();
    
      struct yeshen_http::MemoryStruct chunk;
      chunk.memory = (char *)malloc(1);
      chunk.size = 0;
    
      if (curl)
      {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, yeshen_http::WriteMemoryCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
        CURLcode res = curl_easy_perform(curl);
        int retCode = -1;
        if (res != CURLE_OK)
        {
          std::cerr << "curl_easy_perform() failed:" << curl << curl_easy_strerror(res) << std::endl;
        }
        else if (chunk.size == 0)
        {
          std::cout << (unsigned long)chunk.size << " bytes retrieved" << std::endl;
        }
        else
        {
          std::cout << (unsigned long)chunk.size << " bytes retrieved" << std::endl;
          response = chunk.memory;
          retCode = 0;
        }
        free(chunk.memory);
        curl_easy_cleanup(curl);
        return retCode;
      }
      return -1;
    }
    
    int HTTP::post(const char *url, const std::string &data)
    {
      CURL *curl = curl_easy_init();
      if (curl)
      {
        const char *data_str = data.c_str();
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data_str);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(data_str));
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
          std::cerr << "curl_easy_perform() failed:" << curl_easy_strerror(res) << std::endl;
          return -1;
        }
        curl_easy_cleanup(curl);
        return 0;
      }
      return -1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    cmake部分的处理

    target_link_libraries(${YESHEN_TARGET_NAME} PRIVATE 
        libcurl.so
    )
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Nacos服务列表有服务,但是配置列表不起作用。
    多媒体应用设计师
    Java--SpringMVC之url-pattern,静态资源;URL相对路径,绝对路径
    git将所有patch导出来,并且将其命名为提交的commit记录
    C 语言中关键字const
    一个简单HTML5期末考核大作业,学生个人html静态网页制作代码
    离散数学-万字课堂笔记-期末考试-考研复习-北航离散数学1
    Android—PMS: PackageInstaller到PMS
    MySQL进阶实战9,InnoDB和MyISAM的数据分布对比
    neo4j下载安装最新教程 2024.02
  • 原文地址:https://blog.csdn.net/yeshennet/article/details/132655109