使用libcurl请求https的get/post

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

官方文档见:

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

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

cpp 复制代码
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部分的处理

cmake 复制代码
target_link_libraries(${YESHEN_TARGET_NAME} PRIVATE 
    libcurl.so
)
相关推荐
星辰徐哥9 小时前
易语言网络通信编程基础:HTTP/HTTPS/TCP/UDP实战开发
开发语言·http·https·udp·tcp·易语言
DevilSeagull9 小时前
HTTP/HTTPS数据包拓展
网络·网络协议·http·https·web渗透·we
2501_915918411 天前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone
2501_915106321 天前
混合应用(Hybrid)安全加固,不依赖源码对成品 IPA 混淆
android·安全·小程序·https·uni-app·iphone·webview
00后程序员张1 天前
无需越狱,来对 iOS 设备进行调试、管理与分析
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张1 天前
在 iOS 上架中如何批量方便快捷管理 Bundle ID
android·ios·小程序·https·uni-app·iphone·webview
小白电脑技术1 天前
飞牛绑定免费二级域名ccwu.cc后部署SSL证书教程
网络协议·https·ssl
zhaotiannuo_19982 天前
渗透测试之HTTP\HTTPS协议和BP抓包
网络协议·http·https
2501_915909062 天前
开发与测试阶段跨平台环境查看 iOS App 实时日志
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者82 天前
抓包工具推荐 2026,网络调试、代理抓包、请求拦截
android·ios·小程序·https·uni-app·iphone·webview