当前位置: 首页 > news >正文

使用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_tWriteMemoryCallback(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.lryc.cn/news/158128.html

相关文章:

  • AUTOSAR规范与ECU软件开发(实践篇)7.3 MCAL模块配置方法及常用接口函数介绍之GPT的配置
  • Android 性能优化--内存优化分析总结
  • buuctf web 前5题
  • stable diffusion实践操作-提示词-人物服饰
  • Tomcat加载静态资源--防止SpringMVC拦截
  • 【AI数字人】如何基于ER-NeRF自训练AI数字人
  • 多目标应用:基于多目标哈里斯鹰优化算法(MOHHO)的微电网多目标优化调度研究MATLAB
  • [运维|中间件] 东方通TongWeb忘记密码后修改密码
  • 无涯教程-Android Mock Test函数
  • 保留网络[02/3]:大型语言模型转换器的继任者”
  • 微信小程序-生成canvas图片并保存到手机相册
  • 设计模式8:代理模式-动态代理
  • tcp字节传输(java)-自定义包头和数据识别
  • pyspark 系统找不到指定的路径; \Java\jdk1.8.0_172\bin\java
  • UE4 Physics Constraint Actor 实现钟摆效果
  • UE4/UE5 动画控制
  • Springboot整合shiro
  • 阻塞/非阻塞、同步/异步(网络IO)
  • 为什么大家会觉得考PMP没用?
  • AVR128单片机 USART通信控制发光二极管显示
  • 为什么5G 要分离 CU 和DU?(4G分离RRU 和BBU)
  • Python中的数据输入
  • cms系统稳定性压力测试出现TPS抖动和毛刺的性能bug【杭州多测师_王sir】
  • 【UE】材质描边、外发光、轮廓线
  • 百模大战,打响AI应用生态的新赛点
  • 【C++二叉树】进阶OJ题
  • C++——vector:resize与reserve的区别,验证写入4GB大数据时相比原生操作的效率提升
  • 基础配置xml
  • win环境安装SuperMap iserver和配置许可
  • 【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER(一)