Centos下C++使用libcurl库调用HTTP请求实践

本文介绍如何在C++项目中利用libcurl库发起HTTP Get请求,并提供了从IP到Hostname转换的具体实例代码。此外,还展示了如何进行POST请求及文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 项目中有时候需要在C++代码里借助HTTP请求获取一些在C++里较难实现转换的数据,比如IP->Hostname的转换(这里如果你有更好的方法在C++里调用系统api实现这个功能的请一定要告诉小编哥哥哦~),下面是个人的一点简单实践,主要有:libcurl源码编译安装、Get方法发起请求保存到变量然后输出。

  2. 编译安装libcurl:
    从官网http://curl.haxx.se/download.html上下载最新版的curl-7.50.3.tar.gz,解压,编译,安装:
    tar -zxvf curl-7.50.3.tar.gz
    cd curl-7.50.3.tar.gz
    ./configure --prefix=/usr/local/curl
    make && make install
    其中prefix参数可以指定其它的安装目录,这里图方便就安装在/usr/loca/curl下了,
    安装到非/usr下的目录时编译代码的时候就需要指定这个链接库的目录以及要链接的文件,
    这里在测试过程种发现编译过了但提示有一个文件可能和系统的低版本的有冲突,
    ./main: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
    个人猜测是系统版本的问题(在开发机上的测试结果...匿)
    这里时间原因我也不去我外网的机器上测试了,原理是一样的只要链接上了curl库就可以在C++代码里使用啦~

  1. 实例代码
    在这一步搜到的比较多的都是调用curl获取到返回后写入文件,在官网的文档里仔细查看发现了这个链接https://curl.haxx.se/libcurl/c/getinmemory.html,这样经过简单的改装我们就可以那来用了,我这里只实现了Get方式的HTTP请求,后面有需要Post方式的时候再来补充吧(好吧题主就是这么懒。。)
    下面贴一下我的代码和测试结果:
    屏幕快照 2016-10-28 14.32.16.png
    屏幕快照 2016-10-28 14.32.30.png
    屏幕快照 2016-10-28 14.32.58.png
    测试结果(容易看出来这是一个从ip到hostname转换的一个接口):
    QQ20161028-0.png
    源代码:GetCurl.h

  2. POST请求、异步请求(后面有代码源文件)

void curl::post(string url,string data,string name) {

CURL *curl;
CURLcode res;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
string postfiled = name + "=" + data;
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postfiled.c_str());
// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "key=value");

/* Perform the request, res will get the return code */
//curl_easy_perform是阻塞调用
//res = curl_easy_perform(curl);
//if (res != CURLE_OK)
//fprintf(stderr, "curl_easy_perform() failed: %s\n",
//curl_easy_strerror(res));

//non-blocking fashion.非阻塞调用
CURLM * curl_m = curl_multi_init();
curl_multi_add_handle(curl_m, curl);
int running_handles;
curl_multi_perform(curl_m, &running_handles);
curl_multi_remove_handle(curl_m, curl);

/* always cleanup */
curl_easy_cleanup(curl);

curl_multi_cleanup(curl_m);
}
curl_global_cleanup();

return;

//上面是只提交key=>value的情景的,下面提供上传文件的代码

CURL *curl;
CURLcode res;

struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL;
static const char buf[] = "Expect:";

curl_global_init(CURL_GLOBAL_ALL);

/* Fill in the file upload field */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "/path/to/sendfile.txt",
CURLFORM_END);

/* Fill in the submit field too, even if this is rarely needed */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "submit",
CURLFORM_COPYCONTENTS, "send",
CURLFORM_END);

curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, name.c_str(),
CURLFORM_COPYCONTENTS, data.c_str(),
CURLFORM_END);

curl = curl_easy_init();
/* initialize custom header list (stating that Expect: 100-continue is not wanted /
headerlist = curl_slist_append(headerlist, buf);
if(curl) {
/
 what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);

/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));

/* always cleanup */
curl_easy_cleanup(curl);

/* then cleanup the formpost chain */
curl_formfree(formpost);

/* free slist */
curl_slist_free_all(headerlist);
}

return;

}

C++中,使用libcurl可以方便地访问网络资源,尤其是HTTP(S)等基于TCP的服务。以下是使用CURL的基本步骤: 1. 安装libcurl:首先确保你的系统已经安装了libcurl。如果没有,你可以从curl官网下载源码包编译安装,或者通过包管理器如apt-get (Ubuntu/Debian) 或 yum (CentOS/RHEL)安装。 2. 引入头文件:在C++程序中,需要包含`<curl/curl.h>`来使用CURL API。 ```cpp #include <curl/curl.h> ``` 3. 初始化CURL:创建一个CURL结构体实例,并初始化它。 ```cpp CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { // ... } ``` 4. 设置求信息:设置URL、HTTP方法、认证、头信息等。 ```cpp std::string url = "http://example.com/api"; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // 更多选项设置... ``` 5. 执行求并接收响应:调用`curl_easy_perform(curl)`执行求,然后读取响应数据。 ```cpp size_t write_function(void *ptr, size_t size, size_t nmemb, std::string* data) { data->append((char*) ptr, size * nmemb); return size * nmemb; } std::string response_data; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_function); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_data); res = curl_easy_perform(curl); ``` 6. 处理结果和清理:检查执行结果,完成后记得释放资源。 ```cpp if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); curl_global_cleanup(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值