libcurl简介
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证
libcurl的官网: http://curl.haxx.se/
库下载地址: https://github.com/curl/curl/releases/tag/curl-7_71_1
libcurl的简单使用
初始化libcurl:
curl_global_init()
函数得到 easy interface型指针:
curl_easy_init()
设置传输选项:
curl_easy_setopt()
设置的传输选项,实现回调函数以完成用户特定任务:
curl_easy_setopt()
函数完成传输任务:
curl_easy_perform()
释放内存:
curl_easy_cleanup()
curl_global_init
CURLcode curl_global_init(long flags);函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动调用,所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。
注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
写入此函数避免出现上述风险:
参数:flags
CURL_GLOBAL_ALL //初始化所有的可能的调用。
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化。
C++使用libcurl实现HTTP POST和GET
在C++中使用libcurl实现HTTP POST和GET的源码如下:
#include <curl/curl.h>
#include <string>
class HttpConnection {
public:
HttpConnection() {
curl_global_init(CURL_GLOBAL_ALL);
curl_ = curl_easy_init();
}
~HttpConnection() {
curl_easy_cleanup(curl_);
}
bool Post(const std::string& url, const std::string& data, std::string& response) {
if (!curl_) {
return false;
}
curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_, CURLOPT_POST, 1L);
curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, &WriteCallback);
curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl_);
return (res == CURLE_OK);
}
bool Get(const std::string& url, std::string& response) {
if (!curl_) {
return false;
}
curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, &WriteCallback);
curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl_);
return (res == CURLE_OK);
}
private:
CURL* curl_ = nullptr;
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
size_t realsize = size * nmemb;
std::string* str = static_cast<std::string*>(userp);
str->append(static_cast<char*>(contents), realsize);
return realsize;
}
};
这个类中包含了两个公共方法Post和Get,用于实现HTTP的POST和GET请求。它们接受一个URL参数和可选的请求数据,以及一个用于存储响应的字符串引用。
在使用这个类之前,需要先创建一个实例,并调用Post或Get方法。如果请求成功,方法会返回true,并将服务器响应存储在传递的response字符串中。否则,它将返回false,response将保持为空字符串。
评论区