国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LibCurl】C++使用libcurl實現(xiàn)HTTP POST和GET、PUT

這篇具有很好參考價值的文章主要介紹了【LibCurl】C++使用libcurl實現(xiàn)HTTP POST和GET、PUT。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

libcurl簡介

libcurl是一個跨平臺的網(wǎng)絡(luò)協(xié)議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權(quán),HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認證

libcurl的官網(wǎng): http://curl.haxx.se/

庫下載地址: https://github.com/curl/curl/releases/tag/curl-7_71_1

libcurl的簡單使用

初始化libcurl:

curl_global_init()

函數(shù)得到 easy interface型指針:

curl_easy_init()

設(shè)置傳輸選項:

curl_easy_setopt()

設(shè)置的傳輸選項,實現(xiàn)回調(diào)函數(shù)以完成用戶特定任務(wù):

curl_easy_setopt()

函數(shù)完成傳輸任務(wù):

curl_easy_perform()

釋放內(nèi)存:

curl_easy_cleanup()

curl_global_init

CURLcode curl_global_init(long flags);函數(shù)只能用一次。(其實在調(diào)用curl_global_cleanup 函數(shù)后仍然可再用)

如果這個函數(shù)在curl_easy_init函數(shù)調(diào)用時還沒調(diào)用,它講由libcurl庫自動調(diào)用,

所以多線程下最好主動調(diào)用該函數(shù)以防止在線程中curl_easy_init時多次調(diào)用。

注意:雖然libcurl是線程安全的,但curl_global_init是不能保證線程安全的,

所以不要在每個線程中都調(diào)用curl_global_init,應(yīng)該將該函數(shù)的調(diào)用放在主線程中。

寫入此函數(shù)避免出現(xiàn)上述風(fēng)險:

  • 參數(shù):flags

    CURL_GLOBAL_ALL //初始化所有的可能的調(diào)用。
    CURL_GLOBAL_SSL //初始化支持 安全套接字層。
    CURL_GLOBAL_WIN32 //初始化win32套接字庫。
    CURL_GLOBAL_NOTHING //沒有額外的初始化。

封裝:C++使用libcurl實現(xiàn)HTTP POST和GET

在C++中使用libcurl實現(xiàn)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;
        }

        // set params
		// set curl header
		struct curl_slist* header_list = NULL;
		// der_list = curl_slist_append(header_list, "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");
		header_list = curl_slist_append(header_list, "Content-Type:application/json; charset = UTF-8");
		curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, header_list);    

        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_POST, 0L);
        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,用于實現(xiàn)HTTP的POST和GET請求。

它們接受一個URL參數(shù)和可選的請求數(shù)據(jù),以及一個用于存儲響應(yīng)的字符串引用。

在使用這個類之前,需要先創(chuàng)建一個實例,并調(diào)用Post或Get方法。

如果請求成功,方法會返回true,并將服務(wù)器響應(yīng)存儲在傳遞的response字符串中。

否則,它將返回false,response將保持為空字符串。

擴展,LibCurl 實現(xiàn) Put 操作

#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <check_error.h>

FILE *fp; //定義FILE類型指針

//重寫把數(shù)據(jù)讀入上傳數(shù)據(jù)流函數(shù)
size_t read_file(void* buff, size_t size, size_t nmemb, void* userp)
{
    size_t sizes = fread(buff, size, nmemb, (FILE *)userp);
    return sizes;
}
  
int main(int argc,char **argv)
{
    CURLcode res; //easy_handle定義的一些錯誤碼
    const char url[2096];
    //初始化libcurl

     if(argc!=3)
    {
        printf("please input url and filename");
        exit(-1);
    }
     res = curl_global_init(CURL_GLOBAL_ALL);
    if (res != CURLE_OK)
    {
        printf("init libcurl failed.\n" );
       return -1;
    }


    //獲取要上傳的文件指針
    FILE* r_file = fopen(argv[2], "rb");
    if (0 == r_file)
    {
       printf( "the file %s isnot exit\n",argv[2]);
      return -1;
    }

    CURL* easy_handle;

    easy_handle = curl_easy_init();
    if (0 == easy_handle)
    {
       printf( "get a easy_handle handle fail!");
       fclose(r_file);
       curl_global_cleanup();
       curl_easy_cleanup(easy_handle);
       return -1;
    }

    // 獲取文件大小
    fseek(r_file, 0, 2);
    int file_size = ftell(r_file);
    rewind(r_file);

    curl_easy_setopt(easy_handle, CURLOPT_URL, argv[1]); //獲取URL地址
    curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1); //告訴easy_handle是做上傳操作
    curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, &read_file); //調(diào)用重寫的讀文件流函數(shù)
    curl_easy_setopt(easy_handle, CURLOPT_READDATA, r_file); //往read_file()函數(shù)中傳入用戶自定義的數(shù)據(jù)類型
    curl_easy_setopt(easy_handle, CURLOPT_INFILE, r_file); //定位作為上傳的輸入文件
    curl_easy_setopt(easy_handle, CURLOPT_VERBOSE, 1); //打印出具體http協(xié)議字段
    //curl_easy_setopt(easy_handle, CURLOPT_HEADER, 1);
    curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE, file_size); //上傳的字節(jié)數(shù)

    //執(zhí)行設(shè)置好的操作
    res = curl_easy_perform(easy_handle);

    //獲取HTTP錯誤碼
    int HTTP_flag = 0;
    curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE , &HTTP_flag);

    //一般清理動作
    fclose(r_file);
    curl_global_cleanup();
    curl_easy_cleanup(easy_handle);

    printf("url :%s localfile: %s\n",argv[1],argv[2]);
    printf("HTTP_flag is %d\n",HTTP_flag);

    // printf( "操作本地文件: file_name url:\n");
    //檢測HTTP錯誤碼和執(zhí)行操作結(jié)果
    if (CURLE_OK != res)
    {
       printf("failure\n");
       return -1;
    }
    else
    {
      printf("success\n");
      return 0;
    }
 }

在 StackOverFlow 中有一則關(guān)于 Put 操作的問題:https://stackoverflow.com/questions/7569826/send-string-in-put-request-with-libcurl

其中的回答有說:Dont use curl_easy_setopt(curl, CURLOPT_PUT, 1L);

比較好的寫法是如此:

curl = curl_easy_init();

if (curl) {
    headers = curl_slist_append(headers, client_id_header);
    headers = curl_slist_append(headers, "Content-Type: application/json");

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
    curl_easy_setopt(curl, CURLOPT_URL, request_url);  
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); /* !!! */

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_struct); /* data goes here */

    res = curl_easy_perform(curl);

    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);
}

比較好奇 why 這樣,結(jié)果查詢 LibCurl 官方的資料說:CURLOPT_PUT 已經(jīng)被棄用了(簡單明了,所以正確的使用姿勢應(yīng)該保證是 CURLOPT_UPLOAD Option)文章來源地址http://www.zghlxwxcb.cn/news/detail-854644.html

到了這里,關(guān)于【LibCurl】C++使用libcurl實現(xiàn)HTTP POST和GET、PUT的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++ LibCurl實現(xiàn)Web隱藏目錄掃描

    C++ LibCurl實現(xiàn)Web隱藏目錄掃描

    LibCurl是一個開源的免費的多協(xié)議數(shù)據(jù)傳輸開源庫,該框架具備跨平臺性,開源免費,并提供了包括HTTP、FTP、SMTP、POP3等協(xié)議的功能,使用libcurl可以方便地進行網(wǎng)絡(luò)數(shù)據(jù)傳輸操作,如發(fā)送HTTP請求、下載文件、發(fā)送電子郵件等。它被廣泛應(yīng)用于各種網(wǎng)絡(luò)應(yīng)用開發(fā)中,特別是涉及

    2024年02月04日
    瀏覽(39)
  • C++ LibCurl 庫的使用方法

    C++ LibCurl 庫的使用方法

    LibCurl是一個開源的免費的多協(xié)議數(shù)據(jù)傳輸開源庫,該框架具備跨平臺性,開源免費,并提供了包括 HTTP 、 FTP 、 SMTP 、 POP3 等協(xié)議的功能,使用 libcurl 可以方便地進行網(wǎng)絡(luò)數(shù)據(jù)傳輸操作,如發(fā)送 HTTP 請求、下載文件、發(fā)送電子郵件等。它被廣泛應(yīng)用于各種網(wǎng)絡(luò)應(yīng)用開發(fā)中,特

    2024年02月11日
    瀏覽(18)
  • curl c++ 實現(xiàn)HTTP GET和POST請求

    環(huán)境配置 curl //DV2020T環(huán)境下此步驟可省略 https://curl.se/download/ 筆者安裝為7.85.0版本 ./configure --without-ssl make sudo make install sudo rm /usr/local/lib/curl 系統(tǒng)也有curl庫,為防止沖突,刪去編譯好的curl庫。 對以json數(shù)據(jù)的解析使用開源項目:https://github.com/nlohmann/json cd single_include 在這個文

    2024年03月12日
    瀏覽(23)
  • Linux基礎(chǔ)之HTTP協(xié)議之Libcurl

    Linux基礎(chǔ)之HTTP協(xié)議之Libcurl

    libcurl是一個跨平臺的網(wǎng)絡(luò)協(xié)議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權(quán),HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認證。 libcurl的官網(wǎng):http://curl.haxx.se/ 調(diào)用curl_global_init()初始化libcurl 調(diào)用curl_easy_init()函數(shù)得到

    2024年02月07日
    瀏覽(22)
  • 使用QT實現(xiàn)http里面的get和post

    使用QT實現(xiàn)http里面的get和post

    #1024程序員節(jié)|參與投稿,贏限定勛章和專屬大獎# #假如你有一臺服務(wù)器,你最想做哪些事?# #你被什么樣的BUG困擾過一周以上?# 在http里面下面這些方法和服務(wù)器的響應(yīng)代碼一起用于HTTP協(xié)議中的請求和響應(yīng)交互。請注意,這些函數(shù)不是由編程語言實現(xiàn)的,而是由HTTP協(xié)議規(guī)定

    2024年02月07日
    瀏覽(26)
  • 詳解C++開源網(wǎng)絡(luò)傳輸庫libcurl的編譯過程

    目錄 1、引言 2、直接編譯libcurl工程,提示找不到ssh.h 3、下載并編譯libssh2開源代碼,部署到libcurl目錄中

    2024年02月12日
    瀏覽(14)
  • 64、ubuntu20.04安裝Postman測試http通信和測試其libcurl支持http客戶端發(fā)送request

    64、ubuntu20.04安裝Postman測試http通信和測試其libcurl支持http客戶端發(fā)送request

    基本思想:需要使用http協(xié)議完成業(yè)務(wù)需求,需要測試一下,所以學(xué)習(xí)一下想關(guān)的應(yīng)用實踐 一、下載Postman Postman 帳號某寶解決,也可以試用30天 二、固定postman到任務(wù)欄圖標 添加內(nèi)容 ?再次設(shè)置一下圖標。使用下列命令打開Postman然后用十字光標點擊一下postman工具,顯示下列字

    2023年04月08日
    瀏覽(20)
  • 解決使用 libcurl 與 Charles 抓包的問題

    解決使用 libcurl 與 Charles 抓包的問題

    在使用 C++ 發(fā)送網(wǎng)絡(luò)請求時,利用 libcurl 是個不錯的選擇。然而,有時候我們需要使用 Charles 抓包工具來檢查這些請求,但可能會遇到無法抓取請求包的情況,或者 libcurl 提示代理名稱無法解析等問題。 要抓取 libcurl 的請求,需要設(shè)置代理。下面的代碼演示了如何通過 libcu

    2024年02月05日
    瀏覽(24)
  • libcurl開源庫的編譯與使用全攻略

    libcurl開源庫的編譯與使用全攻略

    libcurl 是一個廣泛使用的、支持多種協(xié)議的、開源的客戶端URL傳輸庫,提供了許多用于數(shù)據(jù)傳輸?shù)腁PI,例如文件傳輸、FTP、HTTP、HTTPS、SMTP等。 libcurl 的主要特點包括 支持多種協(xié)議:libcurl 支持多種協(xié)議,如 HTTP、FTP、SMTP 等,方便開發(fā)者在不同的場景下使用。 易于使用:libc

    2024年02月01日
    瀏覽(58)
  • Libcurl Windows 下的編譯及使用-支持HTTPS

    Libcurl Windows 下的編譯及使用-支持HTTPS

    筆者在產(chǎn)品開發(fā)過程中需要用到https通訊,移植libcurl中遇到很多問題,經(jīng)過搜索和實踐總結(jié)一個行之有效的方案,特總結(jié)系統(tǒng)對大家有所幫助 1. 環(huán)境搭建: libcurl:?curl - Download VS: Visual Studio 2022, 并安裝好本地開發(fā)的C++, MFC桌面開發(fā)SDK 2. LIB庫編譯 打開VS2022命令行工具,注意這

    2024年02月05日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包