c++ 使用libcurl 发送http get/post请求

2023-05-16

使用c++做httpclient时,可以使用libcurl库来解决,它是一个开源跨平台的网络协议库,可以去官网上下载源码编译使用,下载地址:https://curl.haxx.se/download.html,选择source archives中的一个。/docs目录有非常详细的文档,/docs/examples有很多使用的例子,有兴趣的可以看看。

         至于怎么将源码编译成静态库文件,这里就说了,网上搜一下就有。为了方便,可以直接使用我的,里面包含了libcurl的头文件、静态库libcurl和运行时需要的libcurl.dll和zlib1.dll。地址:http://download.csdn.NET/detail/u014489596/9436263。

         这里简单封装了可以实现的发送http请求的 get和post方法。

libcurl.h如下:

[cpp] view plain copy

在CODE上查看代码片派生到我的代码片

  1. #ifndef __LIBCURL_H__  
  2. #define __LIBCURL_H__  
  3.   
  4. #include <string>  
  5. #include <iostream>  
  6. #include "curl/curl.h"  
  7.   
  8.   
  9. static char error_buffer[CURL_ERROR_SIZE];  
  10. static int writer(char*, size_t, size_t, std::string*);  
  11. static bool init(CURL*&, const char*, std::string*);  
  12.   
  13.   
  14. static bool init(CURL*& conn, const char* url, std::string* p_buffer)  
  15. {  
  16.     CURLcode code;  
  17.   
  18.     conn = curl_easy_init();  
  19.     if (NULL == conn)  
  20.     {  
  21.         std::cout << stderr <<  " Failed to create CURL connection" << std::endl;  
  22.         exit(EXIT_FAILURE);  
  23.     }  
  24.   
  25.     code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, error_buffer);  
  26.     if (code != CURLE_OK)  
  27.     {  
  28.         std::cout << stderr << " Failed to set error buffer " << code << std::endl;  
  29.         return false;  
  30.     }  
  31.   
  32.     code = curl_easy_setopt(conn, CURLOPT_URL, url);  
  33.     if (code != CURLE_OK)  
  34.     {  
  35.         std::cout << stderr << " Failed to set URL " << error_buffer << std::endl;  
  36.         return false;  
  37.     }  
  38.   
  39.     code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1);  
  40.     if (code != CURLE_OK)  
  41.     {  
  42.         std::cout << stderr << " Failed to set redirect option " << error_buffer << std::endl;  
  43.         return false;  
  44.     }  
  45.   
  46.     code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);  
  47.     if (code != CURLE_OK)  
  48.     {  
  49.         std::cout << stderr << " Failed to set writer " << error_buffer << std::endl;  
  50.         return false;  
  51.     }  
  52.   
  53.     code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, p_buffer);  
  54.     if (code != CURLE_OK)  
  55.     {  
  56.         std::cout << stderr << " Failed to set write data " << error_buffer << std::endl;  
  57.         return false;  
  58.     }  
  59.   
  60.     return true;  
  61. }  
  62.   
  63. static int writer(char* data, size_t size, size_t nmemb, std::string* writer_data)  
  64. {  
  65.     unsigned long sizes = size * nmemb;  
  66.   
  67.     if (NULL == writer_data)  
  68.     {  
  69.         return 0;  
  70.     }  
  71.   
  72.     writer_data->append(data, sizes);  
  73.       
  74.     return sizes;  
  75. }  
  76.   
  77.   
  78.   
  79. int libcurl_get(const char* url, std::string& buffer, std::string& errinfo)  
  80. {  
  81.   
  82.     CURL *conn = NULL;  
  83.     CURLcode code;  
  84.   
  85.     curl_global_init(CURL_GLOBAL_DEFAULT);  
  86.   
  87.     if (!init(conn, url, &buffer))  
  88.     {  
  89.         std::cout << stderr << " Connection initializion failed" << std::endl;  
  90.         errinfo = "Connection initializion failed\n";  
  91.   
  92.         return -1;  
  93.     }  
  94.   
  95.     code = curl_easy_perform(conn);  
  96.   
  97.     if (code != CURLE_OK)  
  98.     {  
  99.         std::cout << stderr << " Failed to get" << url  << error_buffer << std::endl;  
  100.           
  101.         errinfo.append("Failed to get ");  
  102.         errinfo.append(url);  
  103.   
  104.         return -2;  
  105.     }  
  106.   
  107.     curl_easy_cleanup(conn);  
  108.       
  109.     return 1;  
  110. }  
  111.   
  112.   
  113.   
  114. int libcurl_post(const char* url, const char* data, std::string& buffer, std::string& errinfo)  
  115. {  
  116.     CURL *conn = NULL;  
  117.     CURLcode code;  
  118.   
  119.     curl_global_init(CURL_GLOBAL_DEFAULT);  
  120.   
  121.     if (!init(conn, url, &buffer))  
  122.     {  
  123.         std::cout << stderr << " Connection initializion failed" << std::endl;  
  124.           
  125.         errinfo = "Connection initializion failed\n";  
  126.   
  127.         return -1;  
  128.     }  
  129.   
  130.     code = curl_easy_setopt(conn, CURLOPT_POST, true);  
  131.   
  132.     if (code != CURLE_OK)  
  133.     {  
  134.         std::cout << stderr << " Failed to set CURLOPT_POST " << error_buffer << std::endl;  
  135.         return -1;  
  136.     }  
  137.   
  138.     code = curl_easy_setopt(conn, CURLOPT_POSTFIELDS, data);  
  139.     if (code != CURLE_OK)  
  140.     {  
  141.         std::cout << stderr << " Failed to set CURLOPT_POSTFIELDS " << error_buffer << std::endl;  
  142.         return -1;  
  143.     }  
  144.   
  145.     code = curl_easy_perform(conn);  
  146.   
  147.     if (code != CURLE_OK)  
  148.     {  
  149.         std::cout << stderr << " Failed to post " << url << error_buffer << std::endl;  
  150.   
  151.         errinfo.append("Failed to post ");  
  152.         errinfo.append(url);  
  153.   
  154.         return -2;  
  155.     }  
  156.   
  157.     curl_easy_cleanup(conn);  
  158.       
  159.     return 1;  
  160. }  
  161.   
  162. #endif  

   
  1. #ifndef __LIBCURL_H__

  2. #define __LIBCURL_H__

  3.  
  4. #include <string>

  5. #include <iostream>

  6. #include "curl/curl.h"

  7.  
  8.  
  9. static char error_buffer[CURL_ERROR_SIZE];

  10. static int writer(char*, size_t, size_t, std::string*);

  11. static bool init(CURL*&, const char*, std::string*);

  12.  
  13.  
  14. static bool init(CURL*& conn, const char* url, std::string* p_buffer)

  15. {

  16. CURLcode code;

  17.  
  18. //conn = curl_easy_init();

  19. if (NULL == conn)

  20. {

  21. std::cout << stderr << " Failed to create CURL connection" << std::endl;

  22. exit(EXIT_FAILURE);

  23. }

  24.  
  25. code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, error_buffer);

  26. if (code != CURLE_OK)

  27. {

  28. std::cout << stderr << " Failed to set error buffer " << code << std::endl;

  29. return false;

  30. }

  31.  
  32. code = curl_easy_setopt(conn, CURLOPT_URL, url);

  33. if (code != CURLE_OK)

  34. {

  35. std::cout << stderr << " Failed to set URL " << error_buffer << std::endl;

  36. return false;

  37. }

  38.  
  39. code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1);

  40. if (code != CURLE_OK)

  41. {

  42. std::cout << stderr << " Failed to set redirect option " << error_buffer << std::endl;

  43. return false;

  44. }

  45.  
  46. code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);

  47. if (code != CURLE_OK)

  48. {

  49. std::cout << stderr << " Failed to set writer " << error_buffer << std::endl;

  50. return false;

  51. }

  52.  
  53. code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, p_buffer);

  54. if (code != CURLE_OK)

  55. {

  56. std::cout << stderr << " Failed to set write data " << error_buffer << std::endl;

  57. return false;

  58. }

  59.  
  60. return true;

  61. }

  62.  
  63. static int writer(char* data, size_t size, size_t nmemb, std::string* writer_data)

  64. {

  65. unsigned long sizes = size * nmemb;

  66.  
  67. if (NULL == writer_data)

  68. {

  69. return 0;

  70. }

  71.  
  72. writer_data->append(data, sizes);

  73.  
  74. return sizes;

  75. }

  76.  
  77.  
  78.  
  79. int libcurl_get(const char* url, std::string& buffer, std::string& errinfo)

  80. {

  81.  
  82. CURL *conn = NULL;

  83. CURLcode code;

  84.  
  85. curl_global_init(CURL_GLOBAL_DEFAULT);

  86.  
  87. if (!init(conn, url, &buffer))

  88. {

  89. std::cout << stderr << " Connection initializion failed" << std::endl;

  90. errinfo = "Connection initializion failed\n";

  91.  
  92. return -1;

  93. }

  94.  
  95. code = curl_easy_perform(conn);

  96.  
  97. if (code != CURLE_OK)

  98. {

  99. std::cout << stderr << " Failed to get" << url << error_buffer << std::endl;

  100.  
  101. errinfo.append("Failed to get ");

  102. errinfo.append(url);

  103.  
  104. return -2;

  105. }

  106.  
  107. curl_easy_cleanup(conn);

  108.  
  109. return 1;

  110. }

  111.  
  112.  
  113.  
  114. int libcurl_post(const char* url, const char* data, std::string& buffer, std::string& errinfo)

  115. {

  116. CURL *conn = NULL;

  117. CURLcode code;

  118.  
  119. curl_global_init(CURL_GLOBAL_DEFAULT);

  120.  
  121. if (!init(conn, url, &buffer))

  122. {

  123. std::cout << stderr << " Connection initializion failed" << std::endl;

  124.  
  125. errinfo = "Connection initializion failed\n";

  126.  
  127. return -1;

  128. }

  129.  
  130. code = curl_easy_setopt(conn, CURLOPT_POST, true);

  131.  
  132. if (code != CURLE_OK)

  133. {

  134. std::cout << stderr << " Failed to set CURLOPT_POST " << error_buffer << std::endl;

  135. return -1;

  136. }

  137.  
  138. code = curl_easy_setopt(conn, CURLOPT_POSTFIELDS, data);

  139. if (code != CURLE_OK)

  140. {

  141. std::cout << stderr << " Failed to set CURLOPT_POSTFIELDS " << error_buffer << std::endl;

  142. return -1;

  143. }

  144.  
  145. code = curl_easy_perform(conn);

  146.  
  147. if (code != CURLE_OK)

  148. {

  149. std::cout << stderr << " Failed to post " << url << error_buffer << std::endl;

  150.  
  151. errinfo.append("Failed to post ");

  152. errinfo.append(url);

  153.  
  154. return -2;

  155. }

  156.  
  157. curl_easy_cleanup(conn);

  158.  
  159. return 1;

  160. }

  161.  
  162. #endif

 

 

        使用c++做httpclient的时候只需要将此libcurl.h include进去,libcurl的头文件curl文件夹和链接需要的libcurl.lib和运行需要的libcurl.dll和zlib1.dll在上面已经已经给出了下载地址,下载直接使用。

转载于:https://my.oschina.net/u/4000302/blog/3072274

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 使用libcurl 发送http get/post请求 的相关文章

  • 是否有用于通过 HTTP、HTTP 隧道发送二进制数据的 Java 库?

    我想通过 HTTP 以二进制格式发送相当大的数据块 也称为HTTP 隧道 http en wikipedia org wiki HTTP tunnel 我想通过 Java 将这种技术用于一些 Java Swing 应用程序 也可能是 And
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 将 MIME 编码的附件发布到 Ariba Supply Network 时出现问题

    我在尝试使用 VB NET 和 WebRequest 对象发布一些 cXML 文本和附件时遇到问题 我相信我正在格式化我希望正确发布的数据文本 因为它与 Ariba 提供的示例相匹配 我不确定的是我是否正确使用 WebRequest 对象来
  • 411 需要内容长度

    我正在尝试使用 Android Apache HttpClient 执行 POST 但它返回错误 411 Content Length required 这是代码 HttpClient httpClient new DefaultHttpC
  • 通过 HTTPS 加载页面但请求不安全的 XMLHttpRequest 端点

    我有一个页面 上面有一些 D3 javascript 该页面位于 HTTPS 网站内 但证书是自签名的 当我加载页面时 我的 D3 可视化效果不显示 并且出现错误 混合内容 页面位于 https integration jsite com
  • 按照约定应返回哪些 REST PUT/POST/DELETE 调用?

    根据 REST 意识形态 PUT POST DELETE 请求的响应正文中应该包含什么 返回码呢 是HTTP OK enough 如果有的话 这种约定的原因是什么 我发现了一篇描述 POST PUT 差异的好文章 发布与放置 http ww
  • 如何确定服务器是否支持 Range 标头?

    我一直在尝试使用 Range 标头值从特定点流式传输音频 但我总是从一开始就得到歌曲 我正在通过程序执行此操作 因此不确定问题是否出在我的代码中或服务器上 如何确定服务器是否支持 Range 标头参数 Thanks 方式HTTP规范 htt
  • 使标签充当输入按钮

    我怎样才能做一个 a href http test com tag test Test a 就像表单按钮一样 通过充当表单按钮 我的意思是 当单击链接执行操作时method get 或 post 以便能够通过 get 或 post 捕获它
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 捕获动态表中 HTML 元素的值

    我有从数据库生成的以下动态表
  • ASP.NET Core URL 重写

    我正在尝试将我的网站从 www 重定向到非 www 规则以及 http 到 https https example com https example com 在中间件中 我曾经在 web config 中进行这些重定向更改 例如
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • 如何转义角度 HttpParams?

    在 Angular 服务中 我使用 HttpParams 将字符串发送到服务 get phone string Observable
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s

随机推荐