C/C++使用libcurl库发送http请求(get和post可以用于请求html信息,也可以请求xml和json等串)

4 篇文章 0 订阅

C++要实现http网络连接,需要借助第三方库,libcurl使用起来还是很方便的

环境:win32 + vs2015

如果要在Linux下使用,基本同理

 

1,下载编译libcurl

下载curl源码,找到vs工程,按照x86 x64 并对应debug和release编译出静态库lib

 

2,构建工程

1)curl头文件和lib拷贝到工程目录

2)配置附加包含目录libcurl中的include和附加库目录libcurl中的lib目录

3)添加预编译宏USE_OPENSSL和CURL_STATICLIB

4)添加如依赖库

crypt32.lib
ws2_32.lib
wldap32.lib
libcurl.lib

注意版本对应

 

3,代码示例

[cpp] view plain copy

 

 print?

  1. #include <iostream>  
  2. #include <string>  
  3. #include "curl/curl.h"  
  4. using namespace std;  
  5.   
  6. #pragma comment(lib, "ws2_32.lib")  
  7. #pragma comment(lib, "wldap32.lib")  
  8. #pragma comment(lib, "libcurl.lib")  
  9.   
  10. // reply of the requery  
  11. size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream)  
  12. {  
  13.     cout << "----->reply" << endl;  
  14.     string *str = (string*)stream;  
  15.     cout << *str << endl;  
  16.     (*str).append((char*)ptr, size*nmemb);  
  17.     return size * nmemb;  
  18. }  
  19.   
  20. // http GET  
  21. CURLcode curl_get_req(const std::string &url, std::string &response)  
  22. {  
  23.     // init curl  
  24.     CURL *curl = curl_easy_init();  
  25.     // res code  
  26.     CURLcode res;  
  27.     if (curl)  
  28.     {  
  29.         // set params  
  30.         curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url  
  31.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // if want to use https  
  32.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); // set peer and host verify false  
  33.         curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
  34.         curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
  35.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);  
  36.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);  
  37.         curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
  38.         curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
  39.         curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // set transport and time out time  
  40.         curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);  
  41.         // start req  
  42.         res = curl_easy_perform(curl);  
  43.     }  
  44.     // release curl  
  45.     curl_easy_cleanup(curl);  
  46.     return res;  
  47. }  
  48.   
  49. // http POST  
  50. CURLcode curl_post_req(const string &url, const string &postParams, string &response)  
  51. {  
  52.     // init curl  
  53.     CURL *curl = curl_easy_init();  
  54.     // res code  
  55.     CURLcode res;  
  56.     if (curl)  
  57.     {  
  58.         // set params  
  59.         curl_easy_setopt(curl, CURLOPT_POST, 1); // post req  
  60.         curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url  
  61.         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postParams.c_str()); // params  
  62.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // if want to use https  
  63.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); // set peer and host verify false  
  64.         curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
  65.         curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
  66.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);  
  67.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);  
  68.         curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
  69.         curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
  70.         curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);  
  71.         curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);  
  72.         // start req  
  73.         res = curl_easy_perform(curl);  
  74.     }  
  75.     // release curl  
  76.     curl_easy_cleanup(curl);  
  77.     return res;  
  78. }  
  79.   
  80. int main()  
  81. {  
  82.     // global init  
  83.     curl_global_init(CURL_GLOBAL_ALL);  
  84.   
  85.     // test get requery  
  86.     string getUrlStr = "http://cn.bing.com/images/trending?form=Z9LH";  
  87.     string getResponseStr;  
  88.     auto res = curl_get_req(getUrlStr, getResponseStr);  
  89.     if (res != CURLE_OK)  
  90.         cerr << "curl_easy_perform() failed: " + string(curl_easy_strerror(res)) << endl;  
  91.     else  
  92.         cout << getResponseStr << endl;  
  93.   
  94.     // test post requery  
  95.     string postUrlStr = "https://www.baidu.com/s";  
  96.     string postParams = "f=8&rsv_bp=1&rsv_idx=1&word=picture&tn=98633779_hao_pg";  
  97.     string postResponseStr;  
  98.     auto res = curl_post_req(postUrlStr, postParams, postResponseStr);  
  99.     if (res != CURLE_OK)  
  100.         cerr << "curl_easy_perform() failed: " + string(curl_easy_strerror(res)) << endl;  
  101.     else  
  102.         cout << postResponseStr << endl;  
  103.   
  104.     // global release  
  105.     curl_global_cleanup();  
  106.     system("pause");  
  107.     return 0;  
  108. }  


 

 

    • get和post可以用于请求html信息,也可以请求xml和json等串
    • 可以添加自定义的header 域和cookies
    • 这是libcurl的简单接口,基本等同于阻塞试请求,libcurl有高阶的异步并发接口,运用更复杂
### 回答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、付费专栏及课程。

余额充值