侧边栏壁纸
  • 累计撰写 185 篇文章
  • 累计创建 77 个标签
  • 累计收到 18 条评论

目 录CONTENT

文章目录

C++使用libcurl实现HTTP POST和GET

码峰
2023-02-19 / 0 评论 / 1 点赞 / 2,456 阅读 / 770 字 / 正在检测是否收录...
广告 广告

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将保持为空字符串。

1
广告 广告

评论区