您的位置:

curl-g介绍

一、curl-g是什么?

curl-g是一个基于curl库的C++封装库,它支持多线程、异步、SSL加密、HTTP/HTTPS、FTP/SFTP等多种协议,提供了简单易用的API接口。

curl-g主要解决了在使用原始curl库时繁琐的API调用、线程、连接池等问题。它简化了C++开发者调用curl库时对细节的控制,同时提供了更加高级的特性。

二、curl-g的安装和使用

curl-g的安装非常简单,只需要执行以下命令即可:

git clone https://github.com/ngtech-ltd/curl-g.git
cd curl-g
mkdir build && cd build
cmake ..
make
make install

安装成功后,我们可以开始使用curl-g了。下面是一个简单的示例,它发起了一个HTTP GET请求,并打印出了响应的数据:

curl::easy easy;
easy.set_url("http://www.ngtech.tech");
easy.perform();
std::cout << easy.get_body();

上面的示例非常简单。我们通过curl::easy类构造一个请求对象,设置请求的URL,调用perform()函数进行请求,调用get_body()函数获取响应的数据,最后打印出来。

curl-g的易用性得益于它提供了易用的API接口。除了curl::easy类,curl-g还提供了其他几个常用的类:

  • curl::form:用于发送multipart/form-data类型的表单数据。
  • curl::multi:用于发起多个请求。
  • curl::share:用于共享curl库中的资源,如DNS解析池、连接池等。

三、curl-g的高级特性

1. 多线程

curl-g支持在多个线程中并发使用。下面是一个简单的示例,它在两个线程中发起了HTTP GET请求:

curl::easy easy1, easy2;
easy1.set_url("http://www.ngtech.tech");
easy2.set_url("http://www.baidu.com");

std::thread t1([&](){
    easy1.perform();
    std::cout << easy1.get_body() << std::endl;
});

std::thread t2([&](){
    easy2.perform();
    std::cout << easy2.get_body() << std::endl;
});

t1.join();
t2.join();

在上面的示例中,我们创建了两个curl::easy对象,然后在两个线程中执行它们的perform()函数,并打印出响应结果。可以看到,curl-g支持多线程执行,非常方便。

2. 异步

curl-g还支持异步执行,可以用于实现高性能的请求。下面是一个使用curl::multi类异步执行三个HTTP GET请求的示例:

curl::multi multi;

curl::easy easy1, easy2, easy3;
easy1.set_url("https://www.ngtech.tech");
easy2.set_url("http://www.baidu.com");
easy3.set_url("http://www.google.com");

multi.add(easy1);
multi.add(easy2);
multi.add(easy3);

int still_running = multi.perform();
while (still_running) {
    still_running = multi.perform();
}

std::cout << easy1.get_body() << std::endl;
std::cout << easy2.get_body() << std::endl;
std::cout << easy3.get_body() << std::endl;

在上面的示例中,我们使用curl::multi类实例化一个多请求对象,然后通过调用add()函数添加三个curl::easy对象。接着,调用perform()函数异步执行三个请求,用一个while循环等待所有请求执行完毕。

3. SSL加密

curl-g支持SSL加密,可以用于HTTPS请求。在curl::easy类中,我们可以通过设置SSL证书、私钥、CA证书等参数来进行HTTPS请求。下面是一个使用curl-g发起HTTPS请求的示例:

curl::easy easy;
easy.set_url("https://www.example.com");

curl::ssl_opts ssl_options;
ssl_options.set_cert("./client.pem",      // SSL证书路径
                     "./client.key");     // SSL私钥路径
ssl_options.set_ca("./cacert.pem");       // SSL CA证书路径
easy.set_ssl_opts(ssl_options);           // 设置SSL配置

easy.perform();
std::cout << easy.get_body() << std::endl;

在上面的示例中,我们使用curl::easy类发起了一个HTTPS请求。通过设置cert、key、ca三个参数,我们实现了对SSL证书的校验和安全传输。

4. FTP/SFTP

curl-g不仅支持HTTP/HTTPS协议,还支持FTP/SFTP等协议。下面是一个使用curl::easy类下载FTP文件的示例:

curl::easy easy;
easy.set_url("ftp://ftp.freebsd.org/pub/FreeBSD/README.TXT");
easy.set_username("anonymous");     // 设置FTP用户名
easy.set_password("foo@bar.com");   // 设置FTP密码

curl::write_callback callback = [](char* data, size_t size, size_t nmemb, void* userdata) {
    std::ofstream* file = (std::ofstream*) userdata;
    file->write(data, size * nmemb);
    return size * nmemb;
};

std::ofstream file("README.TXT");   // 打开本地文件
easy.set_write_callback(callback, &file);     // 设置write回调函数

easy.perform();
file.close();

在上面的示例中,我们使用curl::easy类下载了一个FTP文件。通过设置FTP用户名、密码、write回调函数等参数,我们实现了文件的下载。

四、结论

curl-g是一个非常强大的C++网络编程库,它提供了易用的API接口和高级特性,可以用于实现多线程、异步、SSL加密、FTP/SFTP等功能。在项目开发中,使用curl-g可以大大提高开发效率,减少开发难度。