libcurl C++代码测试用例

38 篇文章 0 订阅

编译库和程序

 ./configure --prefix=/opt/libcurl --without-ssl --without-libpsl
 make && make install
 
 g++ -std=c++11 -I./include -L./lib -lcurl curlTestv2.cp

curlTestv2.cp:

#include <curl/curl.h>
#include <iostream>
#include <memory>
#include <sstream>
#include <stdexcept>
#include <string>
#include <vector>
#include <mutex>

class CurlHttp {
public:
    class RequestBuilder;

    CurlHttp() {
        static std::once_flag curlGlobalInitFlag;
        std::call_once(curlGlobalInitFlag, []() {
            curl_global_init(CURL_GLOBAL_ALL);
        });
    }

    ~CurlHttp() = default;

    CurlHttp(const CurlHttp&) = delete;
    CurlHttp& operator=(const CurlHttp&) = delete;

    static size_t writeCallback(char* ptr, size_t size, size_t nmemb, std::ostringstream* stream) {
        stream->write(ptr, size * nmemb);
        return size * nmemb;
    }

    std::string performRequest(const std::string& url, 
                               const std::string& method, 
                               const std::vector<std::string>& headers,
                               const std::string& body,
                               long timeout = 10) {
        std::unique_ptr<CURL, decltype(&curl_easy_cleanup)> curl(curl_easy_init(), &curl_easy_cleanup);
        if (!curl) {
            throw std::runtime_error("CURL initialization failed");
        }

        curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl.get(), CURLOPT_CUSTOMREQUEST, method.c_str());
        if (!body.empty()) {
            curl_easy_setopt(curl.get(), CURLOPT_POSTFIELDS, body.c_str());
        }

        struct curl_slist* curlHeaders = nullptr;
        for (const auto& header : headers) {
            curlHeaders = curl_slist_append(curlHeaders, header.c_str());
        }
        curl_easy_setopt(curl.get(), CURLOPT_HTTPHEADER, curlHeaders);
        curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, writeCallback);
        curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &responseStream);

        // 设置超时
        curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT, timeout);

        CURLcode res = curl_easy_perform(curl.get());
        curl_slist_free_all(curlHeaders); // Clean up headers

        if (res != CURLE_OK) {
            throw std::runtime_error(curl_easy_strerror(res));
        }

        return responseStream.str();
    }
private:
    std::ostringstream responseStream;
};

class CurlHttp::RequestBuilder {
    std::string url;
    std::string method = "GET";
    std::vector<std::string> headers;
    std::string body;
    long timeout = 10; // 默认超时为10秒

public:
    RequestBuilder& setUrl(const std::string& url) {
        this->url = url;
        return *this;
    }

    RequestBuilder& setMethod(const std::string& method) {
        this->method = method;
        return *this;
    }

    RequestBuilder& addHeader(const std::string& header) {
        headers.push_back(header);
        return *this;
    }

    RequestBuilder& setBody(const std::string& body) {
        this->body = body;
        return *this;
    }

    RequestBuilder& setTimeout(long timeout) {
        this->timeout = timeout;
        return *this;
    }

    std::string send() {
        CurlHttp http;
        return http.performRequest(url, method, headers, body, timeout);
    }
};


int main() {
    try {
        std::string getUrl = "http://httpbin.org/get?query=example";
        std::string getResponse = CurlHttp::RequestBuilder()
                                    .setUrl(getUrl)
                                    .setMethod("GET")
                                    .addHeader("Accept: application/json")
                                    .send();
        std::cout << "GET Response: \n" << getResponse << "\n\n";
        std::cout <<  "*** -------------------------------------------------------------***" << std::endl;
        std::string response = CurlHttp::RequestBuilder()
                                .setUrl("http://httpbin.org/post")
                                .setMethod("POST")
                                .addHeader("Content-Type: application/json")
                                .setBody(R"({"key-kkk":"value-vvv"})")
                                .send();
        std::cout << "Response: \n" << response << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    curl_global_cleanup();
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: libcurl是一个功能强大的开源网络传输库,它支持多种协议,包括HTTPHTTPS、FTP等。它在C语言中编写,可以方便地用于不同平台和项目中。 Qt是一个跨平台的GUI应用程序框架,它使用C++编写,并提供了丰富的库和工具集,用于开发各类应用程序。Qt可以与libcurl结合使用,以实现网络传输功能。 通过在Qt应用程序中使用libcurl,我们可以轻松地进行网络数据的请求和传输。无论是向服务器发送HTTP请求获取数据,还是发送FTP请求上传或下载文件,libcurl都提供了丰富的功能和接口。我们可以使用libcurl的API来设置请求的参数,如URL、请求头、请求方法等,并通过回调函数来处理返回的数据。此外,libcurl还支持异步操作,可以在无需等待服务器响应时继续执行其他任务。 使用libcurl进一步扩展了Qt应用程序的功能,使得它可以更方便地与网络进行交互。无论是在开发网页浏览器、下载器、聊天客户端等程序中,还是在与服务器端进行数据交互的应用中,libcurl都是一个强大的工具。它能够处理多线程、断点续传、FTP的SSL连接等复杂情况,为我们的应用程序提供了更多的可能性。 总之,libcurl和Qt是两个功能强大、可扩展性好的工具,它们的结合可以为我们的应用程序提供更多的功能和便利。无论是开发网络应用、网络传输工具还是其他需要网络功能的应用,libcurl和Qt都是不可或缺的利器。 ### 回答2: libcurl是一个开源的多协议文件传输库,可用于在C语言中进行网络数据传输。它支持多种传输协议,如HTTP、FTP、SMTP等,并提供了丰富的功能和选项,使开发者可以轻松地进行网络通信操作。 在使用libcurl时,我们可以通过调用其API函数来实现各种操作,如发送HTTP请求、下载文件、上传文件等。它提供了简洁而强大的接口,使得我们可以方便地处理网络请求和响应。 除了C语言外,libcurl还支持其他编程语言,如C ++、Python等。在C ++中,我们可以使用curlpp库来使用libcurl。curlpp是一个C++的高级封装库,提供了更加面向对象的接口,使得使用libcurl更加简单和舒适。 QT是一个跨平台的开发框架,它提供了丰富的工具和组件,可用于开发各种应用程序。QT框架中提供了QtNetwork模块,用于实现网络通信,其中就包含了对libcurl的支持。我们可以使用QT与libcurl结合,来开发具有网络通信功能的应用程序。 通过结合libcurl和QT,我们可以实现灵活、高效的网络通信。我们可以使用libcurl进行底层的网络传输操作,比如发送HTTP请求、下载文件等;而QT提供的工具和组件则可以帮助我们更好地管理和处理网络请求和响应的数据。 总之,libcurl可以在C语言中实现网络传输,而QT提供了与libcurl结合使用的便捷工具和组件,使得开发网络应用变得更加容易和高效。 ### 回答3: libcurl是一个用于进行网络传输的C语言库。它提供了一组简单的API,使程序员能够通过HTTP、FTP、SMTP等协议进行数据传输。libcurl支持许多功能,包括数据的上传和下载、SSL加密、代理服务器等。 Qt是一个跨平台的C++开发框架,主要用于图形界面开发。Qt提供了丰富的工具和类库,使开发者能够快速构建功能强大的应用程序。除了图形界面开发,Qt还提供了网络通信、数据库访问、多线程等功能。 在libcurl和Qt中,可以结合使用来进行网络通信的开发。libcurl提供了底层的网络传输功能,而Qt提供了更高级的封装,使程序员可以更方便地进行网络操作。 例如,可以使用libcurl来进行HTTP请求的发送和接收数据,而使用Qt来处理接收到的数据并进行界面的更新。这样,就能够实现一个功能完善的网络应用程序。同时,Qt也提供了一些网络相关的类,如QtNetwork模块,用于处理网络相关的操作,充分利用了libcurl和Qt的优点。 总之,libcurl和Qt是两个功能强大的开源库,它们的结合能够帮助开发者更快、更简单地开发出性能优越、界面友好的网络应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值