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

使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言标准库中没有提供直接发送HTTP请求的函数,但是可以使用一些第三方库来实现发送HTTP GET/POST请求的功能,比如libcurllibcurl是一个非常强大的开源网络传输库,提供了丰富的功能和易于使用的API。下面是一个简单版本的使用libcurl发送HTTP GET/POST请求的示例: 1. 导入头文件和初始化libcurl: #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); 2. 设置请求的URL: if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); 3. 发送HTTP GET请求: res = curl_easy_perform(curl); 4. 发送HTTP POST请求: if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); else { // 设置POST请求参数 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "param1=value1&param2=value2"); // 发送POST请求 res = curl_easy_perform(curl); } 5. 检查请求是否成功: if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); 6. 清理和释放资源: curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; } 以上是一个简单的使用libcurl发送HTTP GET/POST请求的示例代码。你可以根据自己的需要进行修改和扩展。 ### 回答2: 在C语言中,我们可以使用libcurl库来实现发送HTTP GET/POST请求的简单版本。 首先,我们需要安装并引入libcurl库。在Ubuntu系统中,我们可以使用以下命令安装libcurl库: ``` sudo apt-get install libcurl4-openssl-dev ``` 然后,我们可以创建一个C源文件,并包含`curl/curl.h`头文件: ```c #include <stdio.h> #include <curl/curl.h> ``` 接下来,我们可以定义一个函数来发送HTTP GET请求,并使用libcurl库完成请求发送和接收: ```c void sendHttpGetRequest(const char* url) { CURL *curl; CURLcode res; // 初始化libcurl curl_global_init(CURL_GLOBAL_DEFAULT); // 创建一个curl句柄 curl = curl_easy_init(); if(curl) { // 设置要请求的URL curl_easy_setopt(curl, CURLOPT_URL, url); // 执行GET请求 res = curl_easy_perform(curl); // 检查请求是否成功 if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); // 清理curl句柄 curl_easy_cleanup(curl); } // 清理libcurl curl_global_cleanup(); } ``` 同样地,我们也可以定义一个函数来发送HTTP POST请求,只需要对发送的数据进行适当的设置即可: ```c void sendHttpPostRequest(const char* url, const char* postData) { CURL *curl; CURLcode res; // 初始化libcurl curl_global_init(CURL_GLOBAL_DEFAULT); // 创建一个curl句柄 curl = curl_easy_init(); if(curl) { // 设置要请求的URL curl_easy_setopt(curl, CURLOPT_URL, url); // 设置POST请求的数据 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData); // 执行POST请求 res = curl_easy_perform(curl); // 检查请求是否成功 if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); // 清理curl句柄 curl_easy_cleanup(curl); } // 清理libcurl curl_global_cleanup(); } ``` 以上代码实现了一个简单版本的发送HTTP GET/POST请求的功能。在发送请求之前,我们需要设置要请求的URL,并可以选择设置POST请求的数据。发送请求之后,我们还可以对返回结果进行适当的处理,根据需要进行错误处理。 当然,这只是一个简单的示例代码。在实际应用中,可能还需要处理更多的HTTP请求选项和参数,以满足具体的需求。 ### 回答3: C语言本身不直接提供发送HTTP请求的功能,但可以通过使用第三方库来实现发送HTTP GET/POST请求的功能。下面给出一个使用libcurl库(一个广泛使用的C库,用于支持各种协议的网络操作)的简单版本示例: ```c #include <stdio.h> #include <curl/curl.h> int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_ALL); // 初始化libcurl curl = curl_easy_init(); // 初始化一个CURL对象 if(curl) { char *url = "http://example.com"; // 请求的URL curl_easy_setopt(curl, CURLOPT_URL, url); // 设置要请求的URL // 执行GET请求 res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); // 清理curl对象 } curl_global_cleanup(); // 清理libcurl return 0; } ``` 上述代码使用libcurl库的`curl_easy_init()`和`curl_easy_setopt()`函数设置请求的URL,并使用`curl_easy_perform()`函数执行GET请求。你可以通过修改`char *url`的值为你要请求的具体URL来发送GET请求。 如果要发送POST请求,你还需要添加一些额外的代码来设置请求体和请求头,以及使用`curl_easy_setopt()`函数设置请求方法为POST。这里提供一个示例来发送带有请求体的POST请求: ```c #include <stdio.h> #include <curl/curl.h> int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if(curl) { char *url = "http://example.com"; char *data = "param1=value1&param2=value2"; // POST请求请求体 curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); // 设置请求体 // 设置请求头 struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 设置请求方法为POST curl_easy_setopt(curl, CURLOPT_POST, 1L); res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } curl_slist_free_all(headers); // 释放请求头的内存 curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; } ``` 上述代码在GET请求的基础上,增加了设置请求体和请求头的代码,以及设置`CURLOPT_POST`选项为`1L`来指定POST方法。你可以根据自己的需求修改`char *url`和`char *data`的值来发送不同的POST请求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值