使用libcurl请求https的get/post

news/2024/7/12 2:46:16 标签: https

最近有个需求,需要用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;
}

cmake部分的处理

target_link_libraries(${YESHEN_TARGET_NAME} PRIVATE 
    libcurl.so
)

http://www.niftyadmin.cn/n/4998119.html

相关文章

java之多线程

一张图说明什么是线程与进程 对于java程序来说,main是一个主线程 说一下生命周期 简单说一下上面几个状态 就绪状态&#xff1a;可运行状态&#xff0c;表示当前线程具有争夺cpu时间片的执行权&#xff0c;这里表他有即将可运行的资格 运行状态&#xff1a;run方法开始&…

语言基础篇8——表达式,多种多样的表达方式

推到表达式与生成器表达式 推导表达式 推导式&#xff0c;一种简写方式&#xff0c;x推导式的结果是推导出的一个x对象 # 列表推导式 a [string for string in ["AAA", "BBB", "CCC"]] print(a, type(a)) # [AAA, BBB, CCC] <class list…

题目:2619.数组原型对象的最后一个元素

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2619. 数组原型对象的最后一个元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 若数组长度为 0 &#xff0c;返回 -1&#xff1b;否则返回最后一个元素 解题代码&#xff1a; Array.p…

利用Cython发布python项目

最近有个python项目要发布&#xff0c;遇到了两个问题&#xff0c;一是项目在windows下运行有点慢&#xff0c;二是python都是脚本直接运行&#xff0c;没法保护代码安全。查了一下&#xff0c;有人说可以利用Cython&#xff0c;把python代码编译成为C来调用。即能提高运行性能…

【反编译APK】

反编译 apktool官网 https://apktool.org/docs/install/ 1 apktool.jar,apktool.bat,apkName.apk放到反编译目录 2 cmd -> apktool d apkName 获得 apkName目录 打包 1 apktool b apkName 打包APK 路径 -> apkName/dist 签名 1 生成签名 keytool -genkey -keystor…

AK 微众银行 9.3 笔试 Java后端方向

T1(模拟,二分) (没看清买的糖果只有前缀&#xff0c;一开始用二分写了&#xff0c;后来意识到也没改了&#xff0c;简单写的话&#xff0c;直接模拟就好了) #include <bits/stdc.h>#define endl \nusing namespace std;const int N 50010;int n; int a[N];bool check(…

Kubernetes技术--集群监控

1.监控指标 监控集群 (1).节点资源的利用率:cpu、内存、存储 (2).节点数量 (3).运行的pods 监控pods (1).监控容器的指标,节点资源利用率 (2).监控应用程序,状态,是否正常 2.监控平台 我们可以使用prometheus + grafana实现监控平台的搭建。 prometheus 是一个

【计算机组成 课程笔记】4.1 乘法器的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 4 - 1 - 401-乘法的运算过程&#xff08;11-33--&#xff09;_哔哩哔哩_bilibili 乘法是比加减法更复杂的算数运算。小学的时候我们学习乘法&#xff0c;需要背一个九九乘法表。那么如果是计算机&#xff0c;又是…